annotate libvo/vo_direct3d.c @ 28992:947ef23ba798

Test if create_vdp_decoder() might succeed by calling it from config() with a small value for max_reference_frames. This does not make automatic recovery by using software decoder possible, but lets MPlayer fail more graciously on - actually existing - buggy hardware that does not support certain H264 widths when using hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on NVIDIA G98) and if the user tries to hardware-decode more samples at the same time than supported. Might break playback of H264 Intra-Only samples on hardware with very little video memory.
author cehoyos
date Sat, 21 Mar 2009 20:11:05 +0000
parents 4172d83194f2
children 517a800e940e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
1 /*
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
2 * Copyright (c) 2008 Georgi Petrov (gogothebee) <gogothebee@gmail.com>
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
3 *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
4 * This file is part of MPlayer.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
5 *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
6 * MPlayer is free software; you can redistribute it and/or modify
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
9 * (at your option) any later version.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
10 *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
11 * MPlayer is distributed in the hope that it will be useful,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
14 * GNU General Public License for more details.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
15 *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License along
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
19 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
20
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
21 #include <windows.h>
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
22 #include <errno.h>
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
23 #include <stdio.h>
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
24 #include <d3d9.h>
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
25 #include "config.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
26 #include "video_out.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
27 #include "video_out_internal.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
28 #include "fastmemcpy.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
29 #include "mp_msg.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
30 #include "aspect.h"
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
31 #include "w32_common.h"
27937
1b333a631c10 Fix and enable panscan handling for vo_direct3d
reimar
parents: 27928
diff changeset
32 #include "libavutil/common.h"
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
33 #include "font_load.h"
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
34 #include "sub.h"
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
35
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
36 static const vo_info_t info =
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
37 {
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
38 "Direct3D 9 Renderer",
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
39 "direct3d",
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
40 "Georgi Petrov (gogothebee) <gogothebee@gmail.com>",
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
41 ""
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
42 };
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
43
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
44 /*
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
45 * Link essential libvo functions: preinit, config, control, draw_frame,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
46 * draw_slice, draw_osd, flip_page, check_events, uninit and
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
47 * the structure info.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
48 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
49 const LIBVO_EXTERN(direct3d)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
50
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
51
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
52 /* Global variables "priv" structure. I try to keep their count low.
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
53 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
54 static struct global_priv {
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
55 int is_paused; /**< 1 = Movie is paused,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
56 0 = Movie is not paused */
27984
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
57 int is_clear_needed; /**< 1 = Clear the backbuffer before StretchRect
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
58 0 = (default) Don't clear it */
28418
2e77aca35aaf Whitespace/comment typo cosmetics.
reimar
parents: 28417
diff changeset
59 D3DLOCKED_RECT locked_rect; /**< The locked offscreen surface */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
60 RECT fs_movie_rect; /**< Rect (upscaled) of the movie when displayed
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
61 in fullscreen */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
62 RECT fs_panscan_rect; /**< PanScan source surface cropping in
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
63 fullscreen */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
64 int src_width; /**< Source (movie) width */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
65 int src_height; /**< Source (movie) heigth */
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
66 int border_x; /**< horizontal border value for OSD */
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
67 int border_y; /**< vertical border value for OSD */
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
68
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
69 D3DFORMAT movie_src_fmt; /**< Movie colorspace format (depends on
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
70 the movie's codec) */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
71 D3DFORMAT desktop_fmt; /**< Desktop (screen) colorspace format.
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
72 Usually XRGB */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
73 LPDIRECT3D9 d3d_handle; /**< Direct3D Handle */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
74 LPDIRECT3DDEVICE9 d3d_device; /**< The Direct3D Adapter */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
75 IDirect3DSurface9 *d3d_surface; /**< Offscreen Direct3D Surface. MPlayer
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
76 renders inside it. Uses colorspace
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
77 priv->movie_src_fmt */
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
78 IDirect3DTexture9 *d3d_texture_osd; /**< Direct3D Texture. Uses RGBA */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
79 IDirect3DTexture9 *d3d_texture_system; /**< Direct3D Texture. System memory
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
80 cannot lock a normal texture. Uses RGBA */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
81 IDirect3DSurface9 *d3d_backbuf; /**< Video card's back buffer (used to
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
82 display next frame) */
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
83 int cur_backbuf_width; /**< Current backbuffer width */
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
84 int cur_backbuf_height; /**< Current backbuffer height */
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
85 int is_osd_populated; /**< 1 = OSD texture has something to display,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
86 0 = OSD texture is clear */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
87 int device_caps_power2_only; /**< 1 = texture sizes have to be power 2
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
88 0 = texture sizes can be anything */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
89 int device_caps_square_only; /**< 1 = textures have to be square
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
90 0 = textures do not have to be square */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
91 int device_texture_sys; /**< 1 = device can texture from system memory
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
92 0 = device requires shadow */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
93 int max_texture_width; /**< from the device capabilities */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
94 int max_texture_height; /**< from the device capabilities */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
95 int osd_width; /**< current width of the OSD */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
96 int osd_height; /**< current height of the OSD */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
97 int osd_texture_width; /**< current width of the OSD texture */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
98 int osd_texture_height; /**< current height of the OSD texture */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
99 } *priv;
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
100
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
101 typedef struct {
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
102 const unsigned int mplayer_fmt; /**< Given by MPlayer */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
103 const D3DFORMAT fourcc; /**< Required by D3D's test function */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
104 } struct_fmt_table;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
105
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
106 /* Map table from reported MPlayer format to the required
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
107 fourcc. This is needed to perform the format query. */
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
108
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
109 static const struct_fmt_table fmt_table[] = {
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
110 {IMGFMT_YV12, MAKEFOURCC('Y','V','1','2')},
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
111 {IMGFMT_I420, MAKEFOURCC('I','4','2','0')},
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
112 {IMGFMT_IYUV, MAKEFOURCC('I','Y','U','V')},
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
113 {IMGFMT_YVU9, MAKEFOURCC('Y','V','U','9')},
28007
16b39ef63bb5 Use D3DFMT_ constants where possible instead of MAKEFOURCC
reimar
parents: 28006
diff changeset
114 {IMGFMT_YUY2, D3DFMT_YUY2},
16b39ef63bb5 Use D3DFMT_ constants where possible instead of MAKEFOURCC
reimar
parents: 28006
diff changeset
115 {IMGFMT_UYVY, D3DFMT_UYVY},
28006
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
116 {IMGFMT_BGR32, D3DFMT_X8R8G8B8},
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
117 {IMGFMT_RGB32, D3DFMT_X8B8G8R8},
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
118 {IMGFMT_BGR24, D3DFMT_R8G8B8}, //untested
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
119 {IMGFMT_BGR16, D3DFMT_R5G6B5},
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
120 {IMGFMT_BGR15, D3DFMT_X1R5G5B5},
c06e8f1eec97 Add support for RGB formats to vo_direct3d
reimar
parents: 27985
diff changeset
121 {IMGFMT_BGR8 , D3DFMT_R3G3B2}, //untested
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
122 };
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
123
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
124 #define DISPLAY_FORMAT_TABLE_ENTRIES (sizeof(fmt_table) / sizeof(fmt_table[0]))
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
125
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
126 #define D3DFVF_MY_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
127
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
128 typedef struct {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
129 float x, y, z; /* Position of vertex in 3D space */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
130 float tu, tv; /* Texture coordinates */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
131 } struct_vertex;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
132
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
133 typedef enum back_buffer_action {
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
134 BACKBUFFER_CREATE,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
135 BACKBUFFER_RESET
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
136 } back_buffer_action_e;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
137 /****************************************************************************
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
138 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
139 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
140 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
141 * Direct3D specific implementation functions *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
142 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
143 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
144 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
145 ****************************************************************************/
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
146
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
147 /** @brief Calculate scaled fullscreen movie rectangle with
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
148 * preserved aspect ratio.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
149 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
150 static void calc_fs_rect(void)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
151 {
28511
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
152 struct vo_rect src_rect;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
153 struct vo_rect dst_rect;
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
154 struct vo_rect borders;
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
155 calc_src_dst_rects(priv->src_width, priv->src_height, &src_rect, &dst_rect, &borders, NULL);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
156
28511
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
157 priv->fs_movie_rect.left = dst_rect.left;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
158 priv->fs_movie_rect.right = dst_rect.right;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
159 priv->fs_movie_rect.top = dst_rect.top;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
160 priv->fs_movie_rect.bottom = dst_rect.bottom;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
161 priv->fs_panscan_rect.left = src_rect.left;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
162 priv->fs_panscan_rect.right = src_rect.right;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
163 priv->fs_panscan_rect.top = src_rect.top;
db19e31a2c7c Add a calc_src_dst_rects that calculates from window size, panscan etc.
reimar
parents: 28434
diff changeset
164 priv->fs_panscan_rect.bottom = src_rect.bottom;
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
165 priv->border_x = borders.left;
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
166 priv->border_y = borders.top;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
167
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
168 mp_msg(MSGT_VO, MSGL_V,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
169 "<vo_direct3d>Fullscreen movie rectangle: t: %ld, l: %ld, r: %ld, b:%ld\n",
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
170 priv->fs_movie_rect.top, priv->fs_movie_rect.left,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
171 priv->fs_movie_rect.right, priv->fs_movie_rect.bottom);
27984
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
172
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
173 /* The backbuffer should be cleared before next StretchRect. This is
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
174 * necessary because our new draw area could be smaller than the
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
175 * previous one used by StretchRect and without it, leftovers from the
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
176 * previous frame will be left. */
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
177 priv->is_clear_needed = 1;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
178 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
179
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
180 /** @brief Destroy D3D Offscreen and Backbuffer surfaces.
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
181 */
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
182 static void destroy_d3d_surfaces(void)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
183 {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
184 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>destroy_d3d_surfaces called.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
185 /* Let's destroy the old (if any) D3D Surfaces */
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
186
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
187 if (priv->locked_rect.pBits)
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
188 IDirect3DSurface9_UnlockRect(priv->d3d_surface);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
189 priv->locked_rect.pBits = NULL;
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
190
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
191 if (priv->d3d_surface)
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
192 IDirect3DSurface9_Release(priv->d3d_surface);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
193 priv->d3d_surface = NULL;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
194
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
195 /* kill the OSD texture and its shadow copy */
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
196 if (priv->d3d_texture_osd)
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
197 IDirect3DTexture9_Release(priv->d3d_texture_osd);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
198 priv->d3d_texture_osd = NULL;
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
199
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
200 if (priv->d3d_texture_system)
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
201 IDirect3DTexture9_Release(priv->d3d_texture_system);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
202 priv->d3d_texture_system = NULL;
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
203
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
204 if (priv->d3d_backbuf)
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
205 IDirect3DSurface9_Release(priv->d3d_backbuf);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
206 priv->d3d_backbuf = NULL;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
207 }
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
208
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
209 /** @brief Create D3D Offscreen and Backbuffer surfaces. Each
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
210 * surface is created only if it's not already present.
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
211 * @return 1 on success, 0 on failure
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
212 */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
213 static int create_d3d_surfaces(void)
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
214 {
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
215 int osd_width = vo_dwidth, osd_height = vo_dheight;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
216 int tex_width = osd_width, tex_height = osd_height;
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
217 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>create_d3d_surfaces called.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
218
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
219 if (!priv->d3d_surface &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
220 FAILED(IDirect3DDevice9_CreateOffscreenPlainSurface(
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
221 priv->d3d_device, priv->src_width, priv->src_height,
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
222 priv->movie_src_fmt, D3DPOOL_DEFAULT, &priv->d3d_surface, NULL))) {
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
223 mp_msg(MSGT_VO, MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
224 "<vo_direct3d>Allocating offscreen surface failed.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
225 return 0;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
226 }
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
227
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
228 if (!priv->d3d_backbuf &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
229 FAILED(IDirect3DDevice9_GetBackBuffer(priv->d3d_device, 0, 0,
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
230 D3DBACKBUFFER_TYPE_MONO,
28029
07ae7bc7487b Cosmetics: Remove unnecessary ()
reimar
parents: 28028
diff changeset
231 &priv->d3d_backbuf))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
232 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Allocating backbuffer failed.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
233 return 0;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
234 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
235
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
236 /* calculate the best size for the OSD depending on the factors from the device */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
237 if (priv->device_caps_power2_only) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
238 tex_width = 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
239 tex_height = 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
240 while (tex_width < osd_width ) tex_width <<= 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
241 while (tex_height < osd_height) tex_height <<= 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
242 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
243 if (priv->device_caps_square_only)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
244 /* device only supports square textures */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
245 tex_width = tex_height = tex_width > tex_height ? tex_width : tex_height;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
246 // better round up to a multiple of 16
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
247 tex_width = (tex_width + 15) & ~15;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
248 tex_height = (tex_height + 15) & ~15;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
249
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
250 // make sure we respect the size limits without breaking aspect or pow2-requirements
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
251 while (tex_width > priv->max_texture_width || tex_height > priv->max_texture_height) {
28418
2e77aca35aaf Whitespace/comment typo cosmetics.
reimar
parents: 28417
diff changeset
252 osd_width >>= 1;
2e77aca35aaf Whitespace/comment typo cosmetics.
reimar
parents: 28417
diff changeset
253 osd_height >>= 1;
2e77aca35aaf Whitespace/comment typo cosmetics.
reimar
parents: 28417
diff changeset
254 tex_width >>= 1;
2e77aca35aaf Whitespace/comment typo cosmetics.
reimar
parents: 28417
diff changeset
255 tex_height >>= 1;
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
256 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
257
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
258 priv->osd_width = osd_width;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
259 priv->osd_height = osd_height;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
260 priv->osd_texture_width = tex_width;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
261 priv->osd_texture_height = tex_height;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
262
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
263 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>OSD texture size (%dx%d), requested (%dx%d).\n",
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
264 vo_dwidth, vo_dheight, priv->osd_texture_width, priv->osd_texture_height);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
265
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
266 /* create OSD */
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
267 if (!priv->d3d_texture_system &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
268 FAILED(IDirect3DDevice9_CreateTexture(priv->d3d_device,
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
269 priv->osd_texture_width,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
270 priv->osd_texture_height,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
271 1,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
272 D3DUSAGE_DYNAMIC,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
273 D3DFMT_A8L8,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
274 D3DPOOL_SYSTEMMEM,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
275 &priv->d3d_texture_system,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
276 NULL))) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
277 mp_msg(MSGT_VO,MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
278 "<vo_direct3d>Allocating OSD texture in system RAM failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
279 return 0;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
280 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
281
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
282 if (!priv->device_texture_sys) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
283 /* only create if we need a shadow version on the external device */
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
284 if (!priv->d3d_texture_osd &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
285 FAILED(IDirect3DDevice9_CreateTexture(priv->d3d_device,
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
286 priv->osd_texture_width,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
287 priv->osd_texture_height,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
288 1,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
289 D3DUSAGE_DYNAMIC,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
290 D3DFMT_A8L8,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
291 D3DPOOL_DEFAULT,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
292 &priv->d3d_texture_osd,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
293 NULL))) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
294 mp_msg(MSGT_VO,MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
295 "<vo_direct3d>Allocating OSD texture in video RAM failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
296 return 0;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
297 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
298 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
299
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
300 /* setup default renderstate */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
301 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_SRCBLEND, D3DBLEND_ONE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
302 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
303 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
304 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHAREF, (DWORD)0x0);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
305 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_LIGHTING, FALSE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
306 IDirect3DDevice9_SetSamplerState(priv->d3d_device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
307 IDirect3DDevice9_SetSamplerState(priv->d3d_device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
308
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
309 return 1;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
310 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
311
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
312 /** @brief Fill D3D Presentation parameters
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
313 */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
314 static void fill_d3d_presentparams(D3DPRESENT_PARAMETERS *present_params)
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
315 {
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
316 /* Prepare Direct3D initialization parameters. */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
317 memset(present_params, 0, sizeof(D3DPRESENT_PARAMETERS));
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
318 present_params->Windowed = TRUE;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
319 present_params->SwapEffect = D3DSWAPEFFECT_COPY;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
320 present_params->Flags = D3DPRESENTFLAG_VIDEO;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
321 present_params->hDeviceWindow = vo_w32_window; /* w32_common var */
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
322 present_params->BackBufferWidth = priv->cur_backbuf_width;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
323 present_params->BackBufferHeight = priv->cur_backbuf_height;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
324 present_params->MultiSampleType = D3DMULTISAMPLE_NONE;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
325 present_params->PresentationInterval = D3DPRESENT_INTERVAL_ONE;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
326 present_params->BackBufferFormat = priv->desktop_fmt;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
327 present_params->BackBufferCount = 1;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
328 present_params->EnableAutoDepthStencil = FALSE;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
329 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
330
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
331
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
332 /** @brief Create a new backbuffer. Create or Reset the D3D
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
333 * device.
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
334 * @return 1 on success, 0 on failure
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
335 */
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
336 static int change_d3d_backbuffer(back_buffer_action_e action)
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
337 {
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
338 D3DPRESENT_PARAMETERS present_params;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
339
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
340 destroy_d3d_surfaces();
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
341
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
342 /* Grow the backbuffer in the required dimension. */
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
343 if (vo_dwidth > priv->cur_backbuf_width)
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
344 priv->cur_backbuf_width = vo_dwidth;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
345
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
346 if (vo_dheight > priv->cur_backbuf_height)
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
347 priv->cur_backbuf_height = vo_dheight;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
348
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
349 /* The grown backbuffer dimensions are ready and fill_d3d_presentparams
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
350 * will use them, so we can reset the device.
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
351 */
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
352 fill_d3d_presentparams(&present_params);
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
353
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
354 /* vo_w32_window is w32_common variable. It's a handle to the window. */
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
355 if (action == BACKBUFFER_CREATE &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
356 FAILED(IDirect3D9_CreateDevice(priv->d3d_handle,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
357 D3DADAPTER_DEFAULT,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
358 D3DDEVTYPE_HAL, vo_w32_window,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
359 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
360 &present_params, &priv->d3d_device))) {
28434
6d926d2693ec Avoid message spam during video adapter uncooperative state.
gogothebee
parents: 28433
diff changeset
361 mp_msg(MSGT_VO, MSGL_V,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
362 "<vo_direct3d>Creating Direct3D device failed.\n");
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
363 return 0;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
364 }
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
365
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
366 if (action == BACKBUFFER_RESET &&
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
367 FAILED(IDirect3DDevice9_Reset(priv->d3d_device, &present_params))) {
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
368 mp_msg(MSGT_VO, MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
369 "<vo_direct3d>Reseting Direct3D device failed.\n");
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
370 return 0;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
371 }
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
372
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
373 mp_msg(MSGT_VO, MSGL_V,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
374 "<vo_direct3d>New backbuffer (%dx%d), VO (%dx%d)\n",
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
375 present_params.BackBufferWidth, present_params.BackBufferHeight,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
376 vo_dwidth, vo_dheight);
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
377
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
378 return 1;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
379 }
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
380
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
381 /** @brief Configure initial Direct3D context. The first
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
382 * function called to initialize the D3D context.
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
383 * @return 1 on success, 0 on failure
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
384 */
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
385 static int configure_d3d(void)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
386 {
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
387 D3DDISPLAYMODE disp_mode;
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
388 D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1};
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
389
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
390 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>configure_d3d called.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
391
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
392 destroy_d3d_surfaces();
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
393
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
394 /* Get the current desktop display mode, so we can set up a back buffer
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
395 * of the same format. */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
396 if (FAILED(IDirect3D9_GetAdapterDisplayMode(priv->d3d_handle,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
397 D3DADAPTER_DEFAULT,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
398 &disp_mode))) {
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
399 mp_msg(MSGT_VO, MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
400 "<vo_direct3d>Reading adapter display mode failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
401 return 0;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
402 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
403
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
404 /* Write current Desktop's colorspace format in the global storage. */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
405 priv->desktop_fmt = disp_mode.Format;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
406
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
407 if (!change_d3d_backbuffer(BACKBUFFER_CREATE))
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
408 return 0;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
409
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
410 if (!create_d3d_surfaces())
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
411 return 0;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
412
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
413 if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
414 &vp))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
415 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n");
28416
0e24a99d51f5 Fix several return values
reimar
parents: 28344
diff changeset
416 return 0;
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
417 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
418
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
419 calc_fs_rect();
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
420
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
421 return 1;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
422 }
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
423
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
424 /** @brief Reconfigure the whole Direct3D. Called only
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
425 * when the video adapter becomes uncooperative.
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
426 * @return 1 on success, 0 on failure
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
427 */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
428 static int reconfigure_d3d(void)
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
429 {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
430 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>reconfigure_d3d called.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
431
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
432 /* Destroy the offscreen, OSD and backbuffer surfaces */
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
433 destroy_d3d_surfaces();
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
434
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
435 /* Destroy the D3D Device */
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
436 if (priv->d3d_device)
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
437 IDirect3DDevice9_Release(priv->d3d_device);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
438 priv->d3d_device = NULL;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
439
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
440 /* Stop the whole Direct3D */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
441 IDirect3D9_Release(priv->d3d_handle);
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
442
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
443 /* Initialize Direct3D from the beginning */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
444 priv->d3d_handle = Direct3DCreate9(D3D_SDK_VERSION);
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
445 if (!priv->d3d_handle) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
446 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Initializing Direct3D failed.\n");
28416
0e24a99d51f5 Fix several return values
reimar
parents: 28344
diff changeset
447 return 0;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
448 }
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
449
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
450 /* Configure Direct3D */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
451 if (!configure_d3d())
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
452 return 0;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
453
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
454 return 1;
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
455 }
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
456
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
457 /** @brief Resize Direct3D context on window resize.
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
458 * @return 1 on success, 0 on failure
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
459 */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
460 static int resize_d3d(void)
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
461 {
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
462 D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1};
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
463
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
464 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>resize_d3d called.\n");
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
465
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
466 /* Make sure that backbuffer is large enough to accomodate the new
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
467 viewport dimensions. Grow it if necessary. */
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
468
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
469 if (vo_dwidth > priv->cur_backbuf_width ||
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
470 vo_dheight > priv->cur_backbuf_height) {
28417
ca1c277b7d7e Check for change_d3d_backbuffer failure.
reimar
parents: 28416
diff changeset
471 if (!change_d3d_backbuffer(BACKBUFFER_RESET))
ca1c277b7d7e Check for change_d3d_backbuffer failure.
reimar
parents: 28416
diff changeset
472 return 0;
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
473 }
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
474
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
475 /* Destroy the OSD textures. They should always match the new dimensions
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
476 * of the onscreen window, so on each resize we need new OSD dimensions.
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
477 */
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
478
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
479 if (priv->d3d_texture_osd)
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
480 IDirect3DTexture9_Release(priv->d3d_texture_osd);
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
481 priv->d3d_texture_osd = NULL;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
482
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
483 if (priv->d3d_texture_system)
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
484 IDirect3DTexture9_Release(priv->d3d_texture_system);
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
485 priv->d3d_texture_system = NULL;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
486
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
487
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
488 /* Recreate the OSD. The function will observe that the offscreen plain
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
489 * surface and the backbuffer are not destroyed and will skip their creation,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
490 * effectively recreating only the OSD.
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
491 */
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
492
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
493 if (!create_d3d_surfaces())
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
494 return 0;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
495
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
496 if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device,
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
497 &vp))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
498 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n");
28416
0e24a99d51f5 Fix several return values
reimar
parents: 28344
diff changeset
499 return 0;
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
500 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
501
27937
1b333a631c10 Fix and enable panscan handling for vo_direct3d
reimar
parents: 27928
diff changeset
502 calc_fs_rect();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
503
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
504 #ifdef CONFIG_FREETYPE
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
505 // font needs to be adjusted
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
506 force_load_font = 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
507 #endif
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
508 // OSD needs to be drawn fresh for new size
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
509 vo_osd_changed(OSDTYPE_OSD);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
510
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
511 return 1;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
512 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
513
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
514 /** @brief Uninitialize Direct3D and close the window.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
515 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
516 static void uninit_d3d(void)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
517 {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
518 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>uninit_d3d called.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
519
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
520 destroy_d3d_surfaces();
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
521
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
522 /* Destroy the D3D Device */
28086
39902ce08dc5 Forgotten part of previous cosmetics commit
reimar
parents: 28085
diff changeset
523 if (priv->d3d_device)
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
524 IDirect3DDevice9_Release(priv->d3d_device);
28086
39902ce08dc5 Forgotten part of previous cosmetics commit
reimar
parents: 28085
diff changeset
525 priv->d3d_device = NULL;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
526
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
527 /* Stop the whole D3D. */
28028
62ccb6c80212 Consistency cosmetics: do not compare against NULL in ifs
reimar
parents: 28027
diff changeset
528 if (priv->d3d_handle) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
529 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Stopping Direct3D.\n");
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
530 IDirect3D9_Release(priv->d3d_handle);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
531 }
28087
46d015b2f8a3 Set d3d_handle to NULL after release.
reimar
parents: 28086
diff changeset
532 priv->d3d_handle = NULL;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
533 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
534
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
535 /** @brief Render a frame on the screen.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
536 * @param mpi mpi structure with the decoded frame inside
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
537 * @return VO_TRUE on success, VO_ERROR on failure
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
538 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
539 static uint32_t render_d3d_frame(mp_image_t *mpi)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
540 {
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
541 /* Uncomment when direct rendering is implemented.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
542 * if (mpi->flags & MP_IMGFLAG_DIRECT) ...
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
543 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
544
28422
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
545 /* If the D3D device is uncooperative (not initialized), return success.
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
546 The device will be probed for reinitialization in the next flip_page() */
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
547 if (!priv->d3d_device)
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
548 return VO_TRUE;
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
549
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
550 if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
27967
ad71ce76c6ce Move the StretchRect call from draw_slices to render_d3d_frame.
reimar
parents: 27966
diff changeset
551 goto skip_upload;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
552
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
553 if (mpi->flags & MP_IMGFLAG_PLANAR) { /* Copy a planar frame. */
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
554 draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0);
27967
ad71ce76c6ce Move the StretchRect call from draw_slices to render_d3d_frame.
reimar
parents: 27966
diff changeset
555 goto skip_upload;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
556 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
557
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
558 /* If we're here, then we should lock the rect and copy a packed frame */
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
559 if (!priv->locked_rect.pBits) {
27970
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
560 if (FAILED(IDirect3DSurface9_LockRect(priv->d3d_surface,
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
561 &priv->locked_rect, NULL, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
562 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Surface lock failed.\n");
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
563 return VO_ERROR;
27970
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
564 }
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
565 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
566
27968
1081658aa871 Move locked_rect from stack to priv struct in preparation for following patch.
reimar
parents: 27967
diff changeset
567 memcpy_pic(priv->locked_rect.pBits, mpi->planes[0], mpi->stride[0],
1081658aa871 Move locked_rect from stack to priv struct in preparation for following patch.
reimar
parents: 27967
diff changeset
568 mpi->height, priv->locked_rect.Pitch, mpi->stride[0]);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
569
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
570 skip_upload:
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
571 /* This unlock is used for both slice_draw path and render_d3d_frame path. */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
572 if (FAILED(IDirect3DSurface9_UnlockRect(priv->d3d_surface))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
573 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Surface unlock failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
574 return VO_ERROR;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
575 }
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
576 priv->locked_rect.pBits = NULL;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
577
27967
ad71ce76c6ce Move the StretchRect call from draw_slices to render_d3d_frame.
reimar
parents: 27966
diff changeset
578 if (FAILED(IDirect3DDevice9_BeginScene(priv->d3d_device))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
579 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>BeginScene failed.\n");
27970
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
580 return VO_ERROR;
27967
ad71ce76c6ce Move the StretchRect call from draw_slices to render_d3d_frame.
reimar
parents: 27966
diff changeset
581 }
ad71ce76c6ce Move the StretchRect call from draw_slices to render_d3d_frame.
reimar
parents: 27966
diff changeset
582
27984
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
583 if (priv->is_clear_needed) {
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
584 IDirect3DDevice9_Clear(priv->d3d_device, 0, NULL,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
585 D3DCLEAR_TARGET, 0, 0, 0);
27984
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
586 priv->is_clear_needed = 0;
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
587 }
21221fd6d994 Make sure the backbuffer is cleared when the border size might have changed.
reimar
parents: 27971
diff changeset
588
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
589 if (FAILED(IDirect3DDevice9_StretchRect(priv->d3d_device,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
590 priv->d3d_surface,
27937
1b333a631c10 Fix and enable panscan handling for vo_direct3d
reimar
parents: 27928
diff changeset
591 &priv->fs_panscan_rect,
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
592 priv->d3d_backbuf,
27937
1b333a631c10 Fix and enable panscan handling for vo_direct3d
reimar
parents: 27928
diff changeset
593 &priv->fs_movie_rect,
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
594 D3DTEXF_LINEAR))) {
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
595 mp_msg(MSGT_VO, MSGL_ERR,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
596 "<vo_direct3d>Copying frame to the backbuffer failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
597 return VO_ERROR;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
598 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
599
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
600 if (FAILED(IDirect3DDevice9_EndScene(priv->d3d_device))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
601 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>EndScene failed.\n");
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
602 return VO_ERROR;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
603 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
604
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
605 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
606 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
607
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
608
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
609 /** @brief Query if movie colorspace is supported by the HW.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
610 * @return 0 on failure, device capabilities (not probed
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
611 * currently) on success.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
612 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
613 static int query_format(uint32_t movie_fmt)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
614 {
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
615 int i;
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
616 for (i = 0; i < DISPLAY_FORMAT_TABLE_ENTRIES; i++) {
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
617 if (fmt_table[i].mplayer_fmt == movie_fmt) {
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
618 /* Test conversion from Movie colorspace to
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
619 * display's target colorspace. */
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
620 if (FAILED(IDirect3D9_CheckDeviceFormatConversion(priv->d3d_handle,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
621 D3DADAPTER_DEFAULT,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
622 D3DDEVTYPE_HAL,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
623 fmt_table[i].fourcc,
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
624 priv->desktop_fmt))) {
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
625 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Rejected image format: %s\n",
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
626 vo_format_name(fmt_table[i].mplayer_fmt));
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
627 return 0;
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
628 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
629
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
630 priv->movie_src_fmt = fmt_table[i].fourcc;
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
631 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Accepted image format: %s\n",
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
632 vo_format_name(fmt_table[i].mplayer_fmt));
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
633 return (VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
634 | VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
635
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
636 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
637 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
638
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
639 return 0;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
640 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
641
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
642 /****************************************************************************
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
643 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
644 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
645 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
646 * libvo Control / Callback functions *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
647 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
648 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
649 * *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
650 ****************************************************************************/
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
651
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
652
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
653
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
654
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
655 /** @brief libvo Callback: Preinitialize the video card.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
656 * Preinit the hardware just enough to be queried about
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
657 * supported formats.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
658 *
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
659 * @return 0 on success, -1 on failure
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
660 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
661
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
662 static int preinit(const char *arg)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
663 {
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
664 D3DDISPLAYMODE disp_mode;
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
665 D3DCAPS9 disp_caps;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
666 DWORD texture_caps;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
667 DWORD dev_caps;
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
668
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
669 /* Set to zero all global variables. */
28027
f210d48c4396 Cosmetics: remove spaces before argument (
reimar
parents: 28026
diff changeset
670 priv = calloc(1, sizeof(struct global_priv));
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
671 if (!priv) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
672 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Allocating private memory failed.\n");
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
673 return -1;
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
674 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
675
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
676 /* FIXME
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
677 > Please use subopt-helper.h for this, see vo_gl.c:preinit for
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
678 > an example of how to use it.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
679 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
680
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
681 priv->d3d_handle = Direct3DCreate9(D3D_SDK_VERSION);
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
682 if (!priv->d3d_handle) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
683 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Initializing Direct3D failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
684 return -1;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
685 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
686
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
687 if (FAILED(IDirect3D9_GetAdapterDisplayMode(priv->d3d_handle,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
688 D3DADAPTER_DEFAULT,
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
689 &disp_mode))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
690 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading display mode failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
691 return -1;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
692 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
693
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
694 /* Store in priv->desktop_fmt the user desktop's colorspace. Usually XRGB. */
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
695 priv->desktop_fmt = disp_mode.Format;
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
696 priv->cur_backbuf_width = disp_mode.Width;
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
697 priv->cur_backbuf_height = disp_mode.Height;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
698
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
699 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Setting backbuffer dimensions to (%dx%d).\n",
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
700 disp_mode.Width, disp_mode.Height);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
701
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
702 if (FAILED(IDirect3D9_GetDeviceCaps(priv->d3d_handle,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
703 D3DADAPTER_DEFAULT,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
704 D3DDEVTYPE_HAL,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
705 &disp_caps))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
706 mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading display capabilities failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
707 return -1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
708 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
709
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
710 /* Store relevant information reguarding caps of device */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
711 texture_caps = disp_caps.TextureCaps;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
712 dev_caps = disp_caps.DevCaps;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
713 priv->device_caps_power2_only = (texture_caps & D3DPTEXTURECAPS_POW2) &&
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
714 !(texture_caps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
715 priv->device_caps_square_only = texture_caps & D3DPTEXTURECAPS_SQUAREONLY;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
716 priv->device_texture_sys = dev_caps & D3DDEVCAPS_TEXTURESYSTEMMEMORY;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
717 priv->max_texture_width = disp_caps.MaxTextureWidth;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
718 priv->max_texture_height = disp_caps.MaxTextureHeight;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
719
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
720 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>device_caps_power2_only %d, device_caps_square_only %d\n"
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
721 "<vo_direct3d>device_texture_sys %d\n"
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
722 "<vo_direct3d>max_texture_width %d, max_texture_height %d\n",
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
723 priv->device_caps_power2_only, priv->device_caps_square_only,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
724 priv->device_texture_sys, priv->max_texture_width,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
725 priv->max_texture_height);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
726
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
727 /* w32_common framework call. Configures window on the screen, gets
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
728 * fullscreen dimensions and does other useful stuff.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
729 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
730 if (!vo_w32_init()) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
731 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Configuring onscreen window failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
732 return -1;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
733 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
734
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
735 return 0;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
736 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
737
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
738
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
739
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
740 /** @brief libvo Callback: Handle control requests.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
741 * @return VO_TRUE on success, VO_NOTIMPL when not implemented
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
742 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
743 static int control(uint32_t request, void *data, ...)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
744 {
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
745 switch (request) {
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
746 case VOCTRL_QUERY_FORMAT:
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
747 return query_format(*(uint32_t*) data);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
748 case VOCTRL_GET_IMAGE: /* Direct Rendering. Not implemented yet. */
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
749 mp_msg(MSGT_VO, MSGL_V,
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
750 "<vo_direct3d>Direct Rendering request. Not implemented yet.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
751 return VO_NOTIMPL;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
752 case VOCTRL_DRAW_IMAGE:
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
753 return render_d3d_frame(data);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
754 case VOCTRL_FULLSCREEN:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
755 vo_w32_fullscreen();
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
756 resize_d3d();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
757 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
758 case VOCTRL_RESET:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
759 return VO_NOTIMPL;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
760 case VOCTRL_PAUSE:
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
761 priv->is_paused = 1;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
762 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
763 case VOCTRL_RESUME:
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
764 priv->is_paused = 0;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
765 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
766 case VOCTRL_GUISUPPORT:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
767 return VO_NOTIMPL;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
768 case VOCTRL_SET_EQUALIZER:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
769 return VO_NOTIMPL;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
770 case VOCTRL_GET_EQUALIZER:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
771 return VO_NOTIMPL;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
772 case VOCTRL_ONTOP:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
773 vo_w32_ontop();
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
774 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
775 case VOCTRL_BORDER:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
776 vo_w32_border();
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
777 resize_d3d();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
778 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
779 case VOCTRL_UPDATE_SCREENINFO:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
780 w32_update_xinerama_info();
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
781 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
782 case VOCTRL_SET_PANSCAN:
28027
f210d48c4396 Cosmetics: remove spaces before argument (
reimar
parents: 28026
diff changeset
783 calc_fs_rect();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
784 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
785 case VOCTRL_GET_PANSCAN:
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
786 return VO_TRUE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
787 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
788 return VO_FALSE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
789 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
790
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
791 /** @brief libvo Callback: Configre the Direct3D adapter.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
792 * @param width Movie source width
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
793 * @param height Movie source height
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
794 * @param d_width Screen (destination) width
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
795 * @param d_height Screen (destination) height
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
796 * @param options Options bitmap
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
797 * @param title Window title
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
798 * @param format Movie colorspace format (using MPlayer's
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
799 * defines, e.g. IMGFMT_YUY2)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
800 * @return 0 on success, VO_ERROR on failure
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
801 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
802 static int config(uint32_t width, uint32_t height, uint32_t d_width,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
803 uint32_t d_height, uint32_t options, char *title,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
804 uint32_t format)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
805 {
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
806
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
807 priv->src_width = width;
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
808 priv->src_height = height;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
809
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
810 /* w32_common framework call. Creates window on the screen with
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
811 * the given coordinates.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
812 */
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
813 if (!vo_w32_config(d_width, d_height, options)) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
814 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Creating onscreen window failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
815 return VO_ERROR;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
816 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
817
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
818 /* "config" may be called several times, so if this is not the first
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
819 * call, we should destroy Direct3D adapter and surfaces before
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
820 * calling configure_d3d, which will create them again.
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
821 */
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
822
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
823 destroy_d3d_surfaces();
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
824
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
825 /* Destroy the D3D Device */
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
826 if (priv->d3d_device)
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
827 IDirect3DDevice9_Release(priv->d3d_device);
28085
f2606c3433ef Slightly simplify the conditional release/free code
reimar
parents: 28084
diff changeset
828 priv->d3d_device = NULL;
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
829
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
830 if (!configure_d3d())
27966
2a7bdb921eee Remove pointless is_cfG_finished variable.
reimar
parents: 27937
diff changeset
831 return VO_ERROR;
2a7bdb921eee Remove pointless is_cfG_finished variable.
reimar
parents: 27937
diff changeset
832
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
833 return 0; /* Success */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
834 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
835
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
836 /** @brief libvo Callback: Flip next already drawn frame on the
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
837 * screen.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
838 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
839 static void flip_page(void)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
840 {
28344
a69d51cd4ee3 Allocate a larger backbuffer to allow resizing without reinit.
reimar
parents: 28087
diff changeset
841 RECT rect = {0, 0, vo_dwidth, vo_dheight};
28422
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
842 if (!priv->d3d_device ||
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
843 FAILED(IDirect3DDevice9_Present(priv->d3d_device, &rect, 0, 0, 0))) {
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
844 mp_msg(MSGT_VO, MSGL_V,
28419
d4fbeeaa1c76 Cosmetics: remove empty line, improve some messages.
reimar
parents: 28418
diff changeset
845 "<vo_direct3d>Trying to reinitialize uncooperative video adapter.\n");
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
846 if (!reconfigure_d3d()) {
28419
d4fbeeaa1c76 Cosmetics: remove empty line, improve some messages.
reimar
parents: 28418
diff changeset
847 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Reinitialization failed.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
848 return;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
849 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
850 else
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
851 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Video adapter reinitialized.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
852 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
853 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
854
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
855 /** @brief libvo Callback: Uninitializes all pointers and closes
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
856 * all D3D related stuff,
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
857 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
858 static void uninit(void)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
859 {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
860 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>uninit called.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
861
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
862 uninit_d3d();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
863 vo_w32_uninit(); /* w32_common framework call */
28027
f210d48c4396 Cosmetics: remove spaces before argument (
reimar
parents: 28026
diff changeset
864 free(priv);
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
865 priv = NULL;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
866 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
867
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
868 /** @brief libvo Callback: Handles video window events.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
869 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
870 static void check_events(void)
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
871 {
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
872 int flags;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
873 /* w32_common framework call. Handles video window events.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
874 * Updates global libvo's vo_dwidth/vo_dheight upon resize
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
875 * with the new window width/height.
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
876 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
877 flags = vo_w32_check_events();
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
878 if (flags & VO_EVENT_RESIZE)
28026
ace2f84df2bd Reorganize Direct3D initialization code.
reimar
parents: 28011
diff changeset
879 resize_d3d();
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
880
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
881 if ((flags & VO_EVENT_EXPOSE) && priv->is_paused)
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
882 flip_page();
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
883 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
884
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
885 /** @brief libvo Callback: Draw slice
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
886 * @return 0 on success
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
887 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
888 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y )
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
889 {
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
890 char *my_src; /**< Pointer to the source image */
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
891 char *dst; /**< Pointer to the destination image */
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
892 int uv_stride; /**< Stride of the U/V planes */
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
893
28422
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
894 /* If the D3D device is uncooperative (not initialized), return success.
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
895 The device will be probed for reinitialization in the next flip_page() */
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
896 if (!priv->d3d_device)
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
897 return 0;
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
898
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
899 /* Lock the offscreen surface if it's not already locked. */
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
900 if (!priv->locked_rect.pBits) {
27970
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
901 if (FAILED(IDirect3DSurface9_LockRect(priv->d3d_surface,
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
902 &priv->locked_rect, NULL, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
903 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Surface lock failure.\n");
27970
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
904 return VO_FALSE;
2b6952476210 Fix indentation
reimar
parents: 27969
diff changeset
905 }
27969
7ddd69cf214f Lock/unlock surface only once even when drawing many slices.
reimar
parents: 27968
diff changeset
906 }
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
907
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
908 uv_stride = priv->locked_rect.Pitch / 2;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
909
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
910 /* Copy Y */
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
911 dst = priv->locked_rect.pBits;
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
912 dst = dst + priv->locked_rect.Pitch * y + x;
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
913 my_src = src[0];
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
914 memcpy_pic(dst, my_src, w, h, priv->locked_rect.Pitch, stride[0]);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
915
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
916 w /= 2;
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
917 h /= 2;
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
918 x /= 2;
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
919 y /= 2;
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
920
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
921 /* Copy U */
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
922 dst = priv->locked_rect.pBits;
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
923 dst = dst + priv->locked_rect.Pitch * priv->src_height
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
924 + uv_stride * y + x;
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
925 if (priv->movie_src_fmt == MAKEFOURCC('Y','V','1','2'))
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
926 my_src = src[2];
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
927 else
28011
7f7ffa0eb45a whitespace cosmetics: prettyprinting and indentation
diego
parents: 28007
diff changeset
928 my_src = src[1];
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
929
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
930 memcpy_pic(dst, my_src, w, h, uv_stride, stride[1]);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
931
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
932 /* Copy V */
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
933 dst = priv->locked_rect.pBits;
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
934 dst = dst + priv->locked_rect.Pitch * priv->src_height
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
935 + uv_stride * (priv->src_height / 2) + uv_stride * y + x;
27928
6bc5182d635c Cosmetics: rename variables etc. in vo_direct3d.c
reimar
parents: 27925
diff changeset
936 if (priv->movie_src_fmt == MAKEFOURCC('Y','V','1','2'))
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
937 my_src=src[1];
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
938 else
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
939 my_src=src[2];
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
940
27971
916445fad12a Patch to improve/consistify coding style.
reimar
parents: 27970
diff changeset
941 memcpy_pic(dst, my_src, w, h, uv_stride, stride[2]);
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
942
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
943 return 0; /* Success */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
944 }
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
945
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
946 /** @brief libvo Callback: Unused function
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
947 */
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
948 static int draw_frame(uint8_t *src[])
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
949 {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
950 mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>draw_frame called.\n");
27921
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
951 return VO_FALSE;
327a98d2b55d Direct3D based video_out module.
reimar
parents:
diff changeset
952 }
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
953
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
954 /** @brief Maps MPlayer alpha to D3D
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
955 * 0x0 -> transparent and discarded by alpha test
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
956 * 0x1 -> 0xFF to become opaque
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
957 * other alpha values are inverted +1 (2 = -2)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
958 * These values are then inverted again with
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
959 the texture filter D3DBLEND_INVSRCALPHA
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
960 */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
961 void vo_draw_alpha_l8a8(int w, int h, unsigned char* src, unsigned char *srca,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
962 int srcstride, unsigned char* dstbase, int dststride)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
963 {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
964 int y;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
965 for (y = 0; y < h; y++) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
966 unsigned short *dst = (unsigned short*)dstbase;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
967 int x;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
968 for (x = 0; x < w; x++) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
969 dst[x] = (-srca[x] << 8) | src[x];
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
970 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
971 src += srcstride;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
972 srca += srcstride;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
973 dstbase += dststride;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
974 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
975 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
976
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
977 /** @brief Callback function to render the OSD to the texture
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
978 */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
979 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
980 unsigned char *srca, int stride)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
981 {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
982 D3DLOCKED_RECT locked_rect; /**< Offscreen surface we lock in order
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
983 to copy MPlayer's frame inside it.*/
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
984
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
985 if (FAILED(IDirect3DTexture9_LockRect(priv->d3d_texture_system, 0,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
986 &locked_rect, NULL, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
987 mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>OSD texture lock failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
988 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
989 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
990
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
991 vo_draw_alpha_l8a8(w, h, src, srca, stride,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
992 (unsigned char *)locked_rect.pBits + locked_rect.Pitch*y0 + 2*x0, locked_rect.Pitch);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
993
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
994 /* this unlock is used for both slice_draw path and D3DRenderFrame path */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
995 if (FAILED(IDirect3DTexture9_UnlockRect(priv->d3d_texture_system, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
996 mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>OSD texture unlock failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
997 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
998 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
999
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1000 priv->is_osd_populated = 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1001 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1002
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1003 /** @brief libvo Callback: Draw OSD/Subtitles,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1004 */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1005 static void draw_osd(void)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1006 {
28422
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
1007 // we can not render OSD if we lost the device e.g. because it was uncooperative
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
1008 if (!priv->d3d_device)
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
1009 return;
f7ba65621809 Add checks that a D3D device is available before attempting rendering.
reimar
parents: 28421
diff changeset
1010
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1011 if (vo_osd_changed(0)) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1012 D3DLOCKED_RECT locked_rect; /**< Offscreen surface we lock in order
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1013 to copy MPlayer's frame inside it.*/
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1014
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1015 /* clear the OSD */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1016 if (FAILED(IDirect3DTexture9_LockRect(priv->d3d_texture_system, 0,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1017 &locked_rect, NULL, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
1018 mp_msg(MSGT_VO,MSGL_ERR, "<vo_direct3d>OSD texture lock failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1019 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1020 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1021
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1022 /* clear the whole texture to avoid issues due to interpolation */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1023 memset(locked_rect.pBits, 0, locked_rect.Pitch * priv->osd_texture_height);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1024
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1025 /* this unlock is used for both slice_draw path and D3DRenderFrame path */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1026 if (FAILED(IDirect3DTexture9_UnlockRect(priv->d3d_texture_system, 0))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
1027 mp_msg(MSGT_VO,MSGL_ERR, "<vo_direct3d>OSD texture unlock failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1028 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1029 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1030
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1031 priv->is_osd_populated = 0;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1032 /* required for if subs are in the boarder region */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1033 priv->is_clear_needed = 1;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1034
28598
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
1035 vo_draw_text_ext(priv->osd_width, priv->osd_height, priv->border_x, priv->border_y,
4172d83194f2 Extend calc_src_dst_rects to also calculate the border values needed for
reimar
parents: 28511
diff changeset
1036 priv->border_x, priv->border_y, priv->src_width, priv->src_height, draw_alpha);
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1037
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1038 if (!priv->device_texture_sys)
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1039 {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1040 /* only DMA to the shadow if its required */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1041 if (FAILED(IDirect3DDevice9_UpdateTexture(priv->d3d_device,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1042 (IDirect3DBaseTexture9 *)priv->d3d_texture_system,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1043 (IDirect3DBaseTexture9 *)priv->d3d_texture_osd))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
1044 mp_msg(MSGT_VO,MSGL_ERR, "<vo_direct3d>OSD texture transfer failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1045 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1046 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1047 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1048 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1049
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1050 /* update OSD */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1051
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1052 if (priv->is_osd_populated) {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1053
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1054 struct_vertex osd_quad_vb[] = {
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1055 {-1.0f, 1.0f, 0.0f, 0, 0 },
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1056 { 1.0f, 1.0f, 0.0f, 1, 0 },
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1057 {-1.0f,-1.0f, 0.0f, 0, 1 },
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1058 { 1.0f,-1.0f, 0.0f, 1, 1 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1059 };
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1060
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1061 /* calculate the texture coordinates */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1062 osd_quad_vb[1].tu =
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1063 osd_quad_vb[3].tu = (float)priv->osd_width / priv->osd_texture_width;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1064 osd_quad_vb[2].tv =
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1065 osd_quad_vb[3].tv = (float)priv->osd_height / priv->osd_texture_height;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1066
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1067 if (FAILED(IDirect3DDevice9_BeginScene(priv->d3d_device))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
1068 mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>BeginScene failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1069 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1070 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1071
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1072 /* turn on alpha test */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1073 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHABLENDENABLE, TRUE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1074 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHATESTENABLE, TRUE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1075
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1076 /* need to use a texture here (done here as we may be able to texture from system memory) */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1077 IDirect3DDevice9_SetTexture(priv->d3d_device, 0,
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1078 (IDirect3DBaseTexture9 *)(priv->device_texture_sys
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1079 ? priv->d3d_texture_system : priv->d3d_texture_osd));
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1080
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1081 IDirect3DDevice9_SetFVF(priv->d3d_device, D3DFVF_MY_VERTEX);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1082 IDirect3DDevice9_DrawPrimitiveUP(priv->d3d_device, D3DPT_TRIANGLESTRIP, 2, osd_quad_vb, sizeof(struct_vertex));
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1083
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1084 /* turn off alpha test */
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1085 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHATESTENABLE, FALSE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1086 IDirect3DDevice9_SetRenderState(priv->d3d_device, D3DRS_ALPHABLENDENABLE, FALSE);
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1087
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1088 if (FAILED(IDirect3DDevice9_EndScene(priv->d3d_device))) {
28433
701150ac1b54 Unify info/error messages to a common style:
gogothebee
parents: 28422
diff changeset
1089 mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>EndScene failed.\n");
28084
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1090 return;
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1091 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1092 }
f38929a49c2f First version of OSD support for vo_direct3d
reimar
parents: 28079
diff changeset
1093 }