Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
6a1a446e
Commit
6a1a446e
authored
Apr 14, 2011
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
No functionnal changes (direct3d).
Reworked a bit texture rendering to prepare for subtitles rendering.
parent
cb021901
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
86 additions
and
85 deletions
+86
-85
modules/video_output/msw/direct3d.c
modules/video_output/msw/direct3d.c
+86
-85
No files found.
modules/video_output/msw/direct3d.c
View file @
6a1a446e
...
...
@@ -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
,
&
region
,
surface
))
{
Direct3DRenderScene
(
vd
,
&
region
);
}
}
...
...
@@ -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
.
0
f
;
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
...
...
@@ -1155,45 +1202,14 @@ static int Direct3DRenderTexture(vout_display_t *vd,
return
0
;
}
/**
* 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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment