[vlc-commits] No functionnal changes (direct3d).
Laurent Aimar
git at videolan.org
Thu Apr 28 23:35:08 CEST 2011
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Apr 14 21:07:31 2011 +0200| [6a1a446e9f78c49156e3c1ffd08b63c55c1e0c44] | committer: Laurent Aimar
No functionnal changes (direct3d).
Reworked a bit texture rendering to prepare for subtitles rendering.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6a1a446e9f78c49156e3c1ffd08b63c55c1e0c44
---
modules/video_output/msw/direct3d.c | 171 ++++++++++++++++++-----------------
1 files changed, 86 insertions(+), 85 deletions(-)
diff --git a/modules/video_output/msw/direct3d.c b/modules/video_output/msw/direct3d.c
index 083ae42..484780d 100644
--- a/modules/video_output/msw/direct3d.c
+++ b/modules/video_output/msw/direct3d.c
@@ -105,9 +105,24 @@ static void Direct3DDestroy(vout_display_t *);
static int Direct3DOpen (vout_display_t *, video_format_t *);
static void Direct3DClose(vout_display_t *);
-static int Direct3DImportPicture(vout_display_t *vd, LPDIRECT3DSURFACE9 surface);
+/* */
+typedef struct
+{
+ FLOAT x,y,z; // vertex untransformed position
+ FLOAT rhw; // eye distance
+ D3DCOLOR diffuse; // diffuse color
+ FLOAT tu, tv; // texture relative coordinates
+} CUSTOMVERTEX;
+#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)
+
+typedef struct {
+ CUSTOMVERTEX vertex[4];
+ LPDIRECT3DTEXTURE9 texture;
+} d3d_region_t;
+
+static int Direct3DImportPicture(vout_display_t *vd, d3d_region_t *, LPDIRECT3DSURFACE9 surface);
-static void Direct3DRenderScene(vout_display_t *vd);
+static void Direct3DRenderScene(vout_display_t *vd, d3d_region_t *);
/* */
static int DesktopCallback(vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void *);
@@ -270,8 +285,9 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
return;
}
- if (!Direct3DImportPicture(vd, surface)) {
- Direct3DRenderScene(vd);
+ d3d_region_t region;
+ if (!Direct3DImportPicture(vd, ®ion, surface)) {
+ Direct3DRenderScene(vd, ®ion);
}
}
@@ -917,17 +933,6 @@ static void Direct3DDestroyPool(vout_display_t *vd)
sys->pool = NULL;
}
-/* */
-typedef struct
-{
- FLOAT x,y,z; // vertex untransformed position
- FLOAT rhw; // eye distance
- D3DCOLOR diffuse; // diffuse color
- FLOAT tu, tv; // texture relative coordinates
-} CUSTOMVERTEX;
-
-#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1)
-
/**
* It allocates and initializes the resources needed to render the scene.
*/
@@ -1058,21 +1063,11 @@ static void Direct3DDestroyScene(vout_display_t *vd)
msg_Dbg(vd, "Direct3D scene released successfully");
}
-static int Direct3DSetupVertices(vout_display_t *vd,
- LPDIRECT3DVERTEXBUFFER9 d3dvtc,
- const RECT src_full,
- const RECT src_crop,
- const RECT dst)
+static void Direct3DSetupVertices(CUSTOMVERTEX *vertices,
+ const RECT src_full,
+ const RECT src_crop,
+ const RECT dst)
{
- HRESULT hr;
-
- CUSTOMVERTEX *vertices;
- hr = IDirect3DVertexBuffer9_Lock(d3dvtc, 0, 0, (void **)&vertices, D3DLOCK_DISCARD);
- if (FAILED(hr)) {
- msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
- return -1;
- }
-
const float src_full_width = src_full.right - src_full.left;
const float src_full_height = src_full.bottom - src_full.top;
vertices[0].x = dst.left;
@@ -1105,23 +1100,75 @@ static int Direct3DSetupVertices(vout_display_t *vd,
vertices[i].rhw = 1.0f;
vertices[i].diffuse = D3DCOLOR_ARGB(255, 255, 255, 255);
}
+}
+
+/**
+ * It copies picture surface into a texture and setup the associated d3d_region_t.
+ */
+static int Direct3DImportPicture(vout_display_t *vd,
+ d3d_region_t *region,
+ LPDIRECT3DSURFACE9 source)
+{
+ vout_display_sys_t *sys = vd->sys;
+ HRESULT hr;
+
+ if (!source) {
+ msg_Dbg(vd, "no surface to render ?");
+ return VLC_EGENERIC;
+ }
- hr= IDirect3DVertexBuffer9_Unlock(d3dvtc);
+ /* retrieve texture top-level surface */
+ LPDIRECT3DSURFACE9 destination;
+ hr = IDirect3DTexture9_GetSurfaceLevel(sys->d3dtex, 0, &destination);
if (FAILED(hr)) {
msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
- return -1;
+ return VLC_EGENERIC;
}
- return 0;
+
+ /* Copy picture surface into texture surface
+ * color space conversion happen here */
+ 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;
+ }
+
+ /* */
+ region->texture = sys->d3dtex;
+ Direct3DSetupVertices(region->vertex,
+ vd->sys->rect_src,
+ vd->sys->rect_src_clipped,
+ vd->sys->rect_dest_clipped);
+ return VLC_SUCCESS;
}
-static int Direct3DRenderTexture(vout_display_t *vd,
- LPDIRECT3DVERTEXBUFFER9 d3dvtc,
- LPDIRECT3DTEXTURE9 d3dtex)
+static int Direct3DRenderRegion(vout_display_t *vd,
+ d3d_region_t *region)
{
- HRESULT hr;
+ vout_display_sys_t *sys = vd->sys;
LPDIRECT3DDEVICE9 d3ddev = vd->sys->d3ddev;
+ LPDIRECT3DVERTEXBUFFER9 d3dvtc = sys->d3dvtc;
+ LPDIRECT3DTEXTURE9 d3dtex = region->texture;
+
+ HRESULT hr;
+
+ /* Import vertices */
+ void *vertex;
+ hr = IDirect3DVertexBuffer9_Lock(d3dvtc, 0, 0, &vertex, D3DLOCK_DISCARD);
+ if (FAILED(hr)) {
+ msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
+ return -1;
+ }
+ memcpy(vertex, region->vertex, sizeof(region->vertex));
+ hr = IDirect3DVertexBuffer9_Unlock(d3dvtc);
+ if (FAILED(hr)) {
+ msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
+ return -1;
+ }
+
// Setup our texture. Using textures introduces the texture stage states,
// which govern how textures get blended together (in the case of multiple
// textures) and lighting information. In this case, we are modulating
@@ -1156,44 +1203,13 @@ static int Direct3DRenderTexture(vout_display_t *vd,
}
/**
- * It copies picture surface into a texture.
- */
-static int Direct3DImportPicture(vout_display_t *vd, LPDIRECT3DSURFACE9 source)
-{
- vout_display_sys_t *sys = vd->sys;
- HRESULT hr;
-
- if (!source) {
- msg_Dbg(vd, "no surface to render ?");
- return VLC_EGENERIC;
- }
-
- /* retrieve texture top-level surface */
- LPDIRECT3DSURFACE9 destination;
- hr = IDirect3DTexture9_GetSurfaceLevel(sys->d3dtex, 0, &destination);
- if (FAILED(hr)) {
- msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
- return VLC_EGENERIC;
- }
-
- /* Copy picture surface into texture surface
- * color space conversion happen here */
- 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)
+static void Direct3DRenderScene(vout_display_t *vd,
+ d3d_region_t *region)
{
vout_display_sys_t *sys = vd->sys;
LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev;
@@ -1214,22 +1230,7 @@ static void Direct3DRenderScene(vout_display_t *vd)
return;
}
- /* 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,
- vd->sys->rect_dest_clipped)) {
- IDirect3DDevice9_EndScene(d3ddev);
- return;
- }
-
- /* Render the texture */
- LPDIRECT3DTEXTURE9 d3dtex = sys->d3dtex;
- if (Direct3DRenderTexture(vd, d3dvtc, d3dtex)) {
- IDirect3DDevice9_EndScene(d3ddev);
- return;
- }
+ Direct3DRenderRegion(vd, region);
// End the scene
hr = IDirect3DDevice9_EndScene(d3ddev);
More information about the vlc-commits
mailing list