[vlc-commits] Moved out non scene rendering related code from Direct3DRenderScene ( direct3d).
Laurent Aimar
git at videolan.org
Thu Apr 28 23:35:08 CEST 2011
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Mon Apr 11 21:34:01 2011 +0200| [cb0219016691993d9775b7b2537ae59ca272e43e] | committer: Laurent Aimar
Moved out non scene rendering related code from Direct3DRenderScene (direct3d).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cb0219016691993d9775b7b2537ae59ca272e43e
---
modules/video_output/msw/direct3d.c | 91 +++++++++++++++++++---------------
1 files changed, 51 insertions(+), 40 deletions(-)
diff --git a/modules/video_output/msw/direct3d.c b/modules/video_output/msw/direct3d.c
index 52de59a..083ae42 100644
--- a/modules/video_output/msw/direct3d.c
+++ b/modules/video_output/msw/direct3d.c
@@ -105,7 +105,9 @@ static void Direct3DDestroy(vout_display_t *);
static int Direct3DOpen (vout_display_t *, video_format_t *);
static void Direct3DClose(vout_display_t *);
-static void Direct3DRenderScene(vout_display_t *vd, LPDIRECT3DSURFACE9 surface);
+static int Direct3DImportPicture(vout_display_t *vd, LPDIRECT3DSURFACE9 surface);
+
+static void Direct3DRenderScene(vout_display_t *vd);
/* */
static int DesktopCallback(vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void *);
@@ -242,11 +244,11 @@ static void Direct3DUnlockSurface(picture_t *);
static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
{
+ vout_display_sys_t *sys = vd->sys;
LPDIRECT3DSURFACE9 surface = picture->p_sys->surface;
#if 0
picture_Release(picture);
VLC_UNUSED(subpicture);
- Direct3DRenderScene(vd, surface);
#else
/* FIXME it is a bit ugly, we need the surface to be unlocked for
* rendering.
@@ -255,10 +257,22 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
* wrapper, we can't */
Direct3DUnlockSurface(picture);
-
- Direct3DRenderScene(vd, surface);
VLC_UNUSED(subpicture);
#endif
+
+ /* check if device is still available */
+ HRESULT hr = IDirect3DDevice9_TestCooperativeLevel(sys->d3ddev);
+ if (FAILED(hr)) {
+ if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) {
+ vout_display_SendEventPicturesInvalid(vd);
+ sys->reset_device = true;
+ }
+ return;
+ }
+
+ if (!Direct3DImportPicture(vd, surface)) {
+ Direct3DRenderScene(vd);
+ }
}
static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
@@ -1141,58 +1155,53 @@ static int Direct3DRenderTexture(vout_display_t *vd,
return 0;
}
-
/**
- * It copies picture surface into a texture and renders into a scene.
- *
- * This function is intented for higher end 3D cards, with pixel shader support
- * and at least 64 MiB of video RAM.
+ * It copies picture surface into a texture.
*/
-static void Direct3DRenderScene(vout_display_t *vd, LPDIRECT3DSURFACE9 surface)
+static int Direct3DImportPicture(vout_display_t *vd, LPDIRECT3DSURFACE9 source)
{
vout_display_sys_t *sys = vd->sys;
- LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev;
HRESULT hr;
- // check if device is still available
- hr = IDirect3DDevice9_TestCooperativeLevel(d3ddev);
- if (FAILED(hr)) {
- if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) {
- vout_display_SendEventPicturesInvalid(vd);
- sys->reset_device = true;
- }
- return;
- }
- /* */
- LPDIRECT3DTEXTURE9 d3dtex = sys->d3dtex;
- LPDIRECT3DVERTEXBUFFER9 d3dvtc = sys->d3dvtc;
-
- /* Clear the backbuffer and the zbuffer */
- hr = IDirect3DDevice9_Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET,
- D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
- if (FAILED(hr)) {
- msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
- return;
- }
- /* retrieve picture surface */
- LPDIRECT3DSURFACE9 d3dsrc = surface;
- if (!d3dsrc) {
+ if (!source) {
msg_Dbg(vd, "no surface to render ?");
- return;
+ return VLC_EGENERIC;
}
/* retrieve texture top-level surface */
- LPDIRECT3DSURFACE9 d3ddest;
- hr = IDirect3DTexture9_GetSurfaceLevel(d3dtex, 0, &d3ddest);
+ LPDIRECT3DSURFACE9 destination;
+ hr = IDirect3DTexture9_GetSurfaceLevel(sys->d3dtex, 0, &destination);
if (FAILED(hr)) {
msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
- return;
+ return VLC_EGENERIC;
}
/* Copy picture surface into texture surface
* color space conversion happen here */
- hr = IDirect3DDevice9_StretchRect(d3ddev, d3dsrc, NULL, d3ddest, NULL, D3DTEXF_NONE);
- IDirect3DSurface9_Release(d3ddest);
+ hr = IDirect3DDevice9_StretchRect(sys->d3ddev, source, NULL, destination, NULL, D3DTEXF_NONE);
+ IDirect3DSurface9_Release(destination);
+ if (FAILED(hr)) {
+ msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
+ return VLC_EGENERIC;
+ }
+ return VLC_SUCCESS;
+}
+
+/**
+ * It renders the scene.
+ *
+ * This function is intented for higher end 3D cards, with pixel shader support
+ * and at least 64 MiB of video RAM.
+ */
+static void Direct3DRenderScene(vout_display_t *vd)
+{
+ vout_display_sys_t *sys = vd->sys;
+ LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev;
+ HRESULT hr;
+
+ /* Clear the backbuffer and the zbuffer */
+ hr = IDirect3DDevice9_Clear(d3ddev, 0, NULL, D3DCLEAR_TARGET,
+ D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
if (FAILED(hr)) {
msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
return;
@@ -1206,6 +1215,7 @@ static void Direct3DRenderScene(vout_display_t *vd, LPDIRECT3DSURFACE9 surface)
}
/* Update the vertex buffer (scaling is setup here) */
+ LPDIRECT3DVERTEXBUFFER9 d3dvtc = sys->d3dvtc;
if (Direct3DSetupVertices(vd, d3dvtc,
vd->sys->rect_src,
vd->sys->rect_src_clipped,
@@ -1215,6 +1225,7 @@ static void Direct3DRenderScene(vout_display_t *vd, LPDIRECT3DSURFACE9 surface)
}
/* Render the texture */
+ LPDIRECT3DTEXTURE9 d3dtex = sys->d3dtex;
if (Direct3DRenderTexture(vd, d3dvtc, d3dtex)) {
IDirect3DDevice9_EndScene(d3ddev);
return;
More information about the vlc-commits
mailing list