vlc | branch: master | Steve Lhomme <[email protected]> | Wed Jun 12 14:18:47 2019 +0200| [75f140ffcd156b83949b00669519dba7647a4a01] | committer: Steve Lhomme
direct3d9: more code reordering Plus some comments > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=75f140ffcd156b83949b00669519dba7647a4a01 --- modules/video_output/win32/direct3d9.c | 94 +++++++++++++++++----------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index cd10d7199f..e34b5416c2 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -160,8 +160,8 @@ struct vout_display_sys_t IDirect3DTexture9 *sceneTexture; IDirect3DVertexBuffer9 *sceneVertexBuffer; D3DFORMAT d3dregion_format; /* Backbuffer output format */ - size_t d3dregion_count; - struct d3d_region_t *d3dregion; + size_t d3dregion_count; /* for subpictures */ + struct d3d_region_t *d3dregion; /* for subpictures */ const d3d9_format_t *sw_texture_fmt; /* Rendering texture(s) format */ IDirect3DSurface9 *dx_render; @@ -191,9 +191,9 @@ typedef struct #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1) typedef struct d3d_region_t { - D3DFORMAT format; - unsigned width; - unsigned height; + D3DFORMAT format; // for subpictures + unsigned width; // for pixel shaders + unsigned height; // for pixel shaders CUSTOMVERTEX vertex[4]; IDirect3DTexture9 *texture; } d3d_region_t; @@ -445,14 +445,6 @@ static int Direct3D9ImportPicture(vout_display_t *vd, return VLC_EGENERIC; } - /* retrieve texture top-level surface */ - IDirect3DSurface9 *destination; - hr = IDirect3DTexture9_GetSurfaceLevel(sys->sceneTexture, 0, &destination); - if (FAILED(hr)) { - msg_Dbg(vd, "Failed IDirect3DTexture9_GetSurfaceLevel: 0x%lX", hr); - return VLC_EGENERIC; - } - /* Copy picture surface into texture surface * color space conversion happen here */ RECT source_visible_rect = { @@ -481,6 +473,14 @@ static int Direct3D9ImportPicture(vout_display_t *vd, source_visible_rect.bottom++; } + /* retrieve texture top-level surface */ + IDirect3DSurface9 *destination; + hr = IDirect3DTexture9_GetSurfaceLevel(sys->sceneTexture, 0, &destination); + if (FAILED(hr)) { + msg_Dbg(vd, "Failed IDirect3DTexture9_GetSurfaceLevel: 0x%lX", hr); + return VLC_EGENERIC; + } + hr = IDirect3DDevice9_StretchRect(sys->d3d_dev.dev, source, &source_visible_rect, destination, &texture_visible_rect, D3DTEXF_NONE); @@ -684,6 +684,13 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt) return VLC_EGENERIC; } + // we use FVF instead of vertex shader + hr = IDirect3DDevice9_SetFVF(d3ddev, D3DFVF_CUSTOMVERTEX); + if (FAILED(hr)) { + msg_Dbg(vd, "Failed SetFVF: 0x%lX", hr); + return -1; + } + /* */ sys->d3dregion_count = 0; sys->d3dregion = NULL; @@ -1100,7 +1107,7 @@ static void Direct3D9ImportSubpicture(vout_display_t *vd, } static int Direct3D9RenderRegion(vout_display_t *vd, - d3d_region_t *region, + const d3d_region_t *region, bool use_pixel_shader) { vout_display_sys_t *sys = vd->sys; @@ -1123,6 +1130,13 @@ static int Direct3D9RenderRegion(vout_display_t *vd, return -1; } + // Render the vertex buffer contents + hr = IDirect3DDevice9_SetStreamSource(d3ddev, 0, sys->sceneVertexBuffer, 0, sizeof(CUSTOMVERTEX)); + if (FAILED(hr)) { + msg_Dbg(vd, "Failed SetStreamSource: 0x%lX", 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 @@ -1152,20 +1166,6 @@ static int Direct3D9RenderRegion(vout_display_t *vd, } } - // Render the vertex buffer contents - hr = IDirect3DDevice9_SetStreamSource(d3ddev, 0, sys->sceneVertexBuffer, 0, sizeof(CUSTOMVERTEX)); - if (FAILED(hr)) { - msg_Dbg(vd, "Failed SetStreamSource: 0x%lX", hr); - return -1; - } - - // we use FVF instead of vertex shader - hr = IDirect3DDevice9_SetFVF(d3ddev, D3DFVF_CUSTOMVERTEX); - if (FAILED(hr)) { - msg_Dbg(vd, "Failed SetFVF: 0x%lX", hr); - return -1; - } - // draw rectangle hr = IDirect3DDevice9_DrawPrimitive(d3ddev, D3DPT_TRIANGLEFAN, 0, 2); if (FAILED(hr)) { @@ -1276,15 +1276,33 @@ static void Prepare(vout_display_t *vd, picture_t *picture, sys->area.place_changed = false; } - picture_sys_d3d9_t *p_sys = picture->p_sys; - IDirect3DSurface9 *surface = p_sys->surface; d3d9_device_t *p_d3d9_dev = &sys->d3d_dev; + /* check if device is still available */ + HRESULT hr = IDirect3DDevice9_TestCooperativeLevel(p_d3d9_dev->dev); + if (FAILED(hr)) { + if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) { + if (vd->info.has_pictures_invalid) + vout_display_SendEventPicturesInvalid(vd); + sys->reset_device = true; + sys->lost_not_ready = false; + } + if (hr == D3DERR_DEVICELOST && !sys->lost_not_ready) { + /* Device is lost but not yet ready for reset. */ + sys->lost_not_ready = true; + } + return; + } + /* FIXME it is a bit ugly, we need the surface to be unlocked for * rendering. * The clean way would be to release the picture (and ensure that * the vout doesn't keep a reference). But because of the vout * wrapper, we can't */ + IDirect3DSurface9 *surface; + + picture_sys_d3d9_t *p_sys = picture->p_sys; + surface = p_sys->surface; if ( !is_d3d9_opaque(picture->format.i_chroma) ) { D3DLOCKED_RECT d3drect; @@ -1327,22 +1345,6 @@ static void Prepare(vout_display_t *vd, picture_t *picture, } } - /* check if device is still available */ - HRESULT hr = IDirect3DDevice9_TestCooperativeLevel(p_d3d9_dev->dev); - if (FAILED(hr)) { - if (hr == D3DERR_DEVICENOTRESET && !sys->reset_device) { - if (vd->info.has_pictures_invalid) - vout_display_SendEventPicturesInvalid(vd); - sys->reset_device = true; - sys->lost_not_ready = false; - } - if (hr == D3DERR_DEVICELOST && !sys->lost_not_ready) { - /* Device is lost but not yet ready for reset. */ - sys->lost_not_ready = true; - } - return; - } - d3d_region_t picture_region; if (!Direct3D9ImportPicture(vd, &picture_region, surface)) { picture_region.width = picture->format.i_visible_width; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
