/** @brief Resize Direct3D context on window resize. * @return 1 on success, 0 on failure */ static int resize_d3d(void) { D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1}; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>resize_d3d called.\n"); /* Make sure that backbuffer is large enough to accomodate the new viewport dimensions. Grow it if necessary. */ if (vo_dwidth > priv->cur_backbuf_width || vo_dheight > priv->cur_backbuf_height) { if (!change_d3d_backbuffer(BACKBUFFER_RESET)) return 0; } /* Destroy the OSD textures. They should always match the new dimensions * of the onscreen window, so on each resize we need new OSD dimensions. */ if (priv->d3d_texture_osd) IDirect3DTexture9_Release(priv->d3d_texture_osd); priv->d3d_texture_osd = NULL; if (priv->d3d_texture_system) IDirect3DTexture9_Release(priv->d3d_texture_system); priv->d3d_texture_system = NULL; /* Recreate the OSD. The function will observe that the offscreen plain * surface and the backbuffer are not destroyed and will skip their creation, * effectively recreating only the OSD. */ if (!create_d3d_surfaces()) return 0; if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device, &vp))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n"); return 0; } calc_fs_rect(); #ifdef CONFIG_FREETYPE // font needs to be adjusted force_load_font = 1; #endif // OSD needs to be drawn fresh for new size vo_osd_changed(OSDTYPE_OSD); return 1; }
/** @brief libvo Callback: Handle control requests. * @return VO_TRUE on success, VO_NOTIMPL when not implemented */ static int control(uint32_t request, void *data, ...) { switch (request) { case VOCTRL_QUERY_FORMAT: return query_format(*(uint32_t*) data); case VOCTRL_GET_IMAGE: /* Direct Rendering. Not implemented yet. */ mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Direct Rendering request. Not implemented yet.\n"); return VO_NOTIMPL; case VOCTRL_DRAW_IMAGE: return render_d3d_frame(data); case VOCTRL_FULLSCREEN: vo_w32_fullscreen(); resize_d3d(); return VO_TRUE; case VOCTRL_RESET: return VO_NOTIMPL; case VOCTRL_PAUSE: priv->is_paused = 1; return VO_TRUE; case VOCTRL_RESUME: priv->is_paused = 0; return VO_TRUE; case VOCTRL_GUISUPPORT: return VO_NOTIMPL; case VOCTRL_SET_EQUALIZER: return VO_NOTIMPL; case VOCTRL_GET_EQUALIZER: return VO_NOTIMPL; case VOCTRL_ONTOP: vo_w32_ontop(); return VO_TRUE; case VOCTRL_BORDER: vo_w32_border(); resize_d3d(); return VO_TRUE; case VOCTRL_UPDATE_SCREENINFO: w32_update_xinerama_info(); return VO_TRUE; case VOCTRL_SET_PANSCAN: calc_fs_rect(); return VO_TRUE; case VOCTRL_GET_PANSCAN: return VO_TRUE; } return VO_FALSE; }
/** @brief Configure initial Direct3D context. The first * function called to initialize the D3D context. * @return 1 on success, 0 on failure */ static int configure_d3d(void) { D3DDISPLAYMODE disp_mode; D3DVIEWPORT9 vp = {0, 0, vo_dwidth, vo_dheight, 0, 1}; mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>configure_d3d called.\n"); destroy_d3d_surfaces(); /* Get the current desktop display mode, so we can set up a back buffer * of the same format. */ if (FAILED(IDirect3D9_GetAdapterDisplayMode(priv->d3d_handle, D3DADAPTER_DEFAULT, &disp_mode))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Reading adapter display mode failed.\n"); return 0; } /* Write current Desktop's colorspace format in the global storage. */ priv->desktop_fmt = disp_mode.Format; if (!change_d3d_backbuffer(BACKBUFFER_CREATE)) return 0; if (!create_d3d_surfaces()) return 0; if (FAILED(IDirect3DDevice9_SetViewport(priv->d3d_device, &vp))) { mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Setting viewport failed.\n"); return 0; } calc_fs_rect(); return 1; }