vlc | branch: master | Steve Lhomme <[email protected]> | Wed Jun 19 09:41:03 2019 +0200| [851a4d09d06ff0f6944142ca8d9e318c03c2da47] | committer: Steve Lhomme
d3d11_fmt: Do not use the external (display) pool anymore We can push pictures to the display with zero copy as this is the same device. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=851a4d09d06ff0f6944142ca8d9e318c03c2da47 --- modules/codec/avcodec/d3d11va.c | 164 +------------------------------- modules/video_chroma/d3d11_fmt.c | 27 ------ modules/video_chroma/d3d11_fmt.h | 1 - modules/video_output/win32/direct3d11.c | 5 +- 4 files changed, 6 insertions(+), 191 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index 91e065a360..bf3e2d27d7 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -71,13 +71,6 @@ vlc_module_begin() set_va_callback(Open, 110) vlc_module_end() -/* - * In this mode libavcodec doesn't need the whole array on texture on startup - * So we get the surfaces from the decoder pool when needed. We don't need to - * extract the decoded surface into the decoder picture anymore. - */ -#define D3D11_DIRECT_DECODE LIBAVCODEC_VERSION_CHECK( 57, 30, 3, 72, 101 ) - #include <initguid.h> /* must be last included to not redefine existing GUIDs */ /* dxva2api.h GUIDs: http://msdn.microsoft.com/en-us/library/windows/desktop/ms697067(v=vs100).aspx @@ -103,10 +96,6 @@ DEFINE_GUID(DXVA2_NoEncrypt, 0x1b81bed0, 0xa0c7, 0x11d3, struct vlc_va_sys_t { - UINT totalTextureSlices; - unsigned textureWidth; - unsigned textureHeight; - d3d11_handle_t hd3d; d3d11_device_t d3d_dev; @@ -115,9 +104,6 @@ struct vlc_va_sys_t /* Video service */ DXGI_FORMAT render; - /* pool */ - picture_t *extern_pics[MAX_SURFACE_COUNT]; - /* Video decoder */ D3D11_VIDEO_DECODER_CONFIG cfg; const directx_va_mode_t *selected_decoder; @@ -248,43 +234,6 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) { vlc_va_sys_t *sys = va->sys; picture_sys_d3d11_t *p_sys = pic->p_sys; -#if D3D11_DIRECT_DECODE - if (sys->va_pool->can_extern_pool) - { - /* copy the original picture_sys_d3d11_t in the va_pic_context */ - if (!pic->context) - { - assert(p_sys!=NULL); - if (!p_sys->decoder) - { - HRESULT hr; - D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc; - ZeroMemory(&viewDesc, sizeof(viewDesc)); - viewDesc.DecodeProfile = *sys->selected_decoder->guid; - viewDesc.ViewDimension = D3D11_VDOV_DIMENSION_TEXTURE2D; - viewDesc.Texture2D.ArraySlice = p_sys->slice_index; - - hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( sys->d3ddec, - p_sys->resource[KNOWN_DXGI_INDEX], - &viewDesc, - &p_sys->decoder ); - if (FAILED(hr)) - return VLC_EGENERIC; - } - - struct d3d11va_pic_context *pic_ctx = CreatePicContext( - p_sys->decoder, - p_sys->resource[KNOWN_DXGI_INDEX], - sys->d3d_dev.d3dcontext, - p_sys->slice_index, - p_sys->renderSrc ); - if (pic_ctx == NULL) - return VLC_EGENERIC; - pic->context = &pic_ctx->ctx.s; - } - } - else -#endif { vlc_va_surface_t *va_surface = va_pool_Get(sys->va_pool); if (unlikely(va_surface == NULL)) @@ -646,13 +595,6 @@ static int DxSetupOutput(vlc_va_t *va, const directx_va_mode_t *mode, const vide } msg_Dbg(va, "Using output format %s for decoder %s", DxgiFormatToStr(processorInput[idx]), mode->name); - if ( sys->render == processorInput[idx] && sys->totalTextureSlices > 4) - { - if (CanUseVoutPool(&sys->d3d_dev, sys->totalTextureSlices)) - sys->va_pool->can_extern_pool = true; - else - msg_Warn( va, "use internal pool" ); - } sys->render = processorInput[idx]; return VLC_SUCCESS; } @@ -694,35 +636,11 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, ID3D10Multithread_Release(pMultithread); } - if (!sys->textureWidth || !sys->textureHeight) - { - sys->textureWidth = fmt->i_width; - sys->textureHeight = fmt->i_height; - } - - assert(sys->textureWidth >= fmt->i_width); - assert(sys->textureHeight >= fmt->i_height); - - if ((sys->textureWidth != fmt->i_width || sys->textureHeight != fmt->i_height) && - !CanUseDecoderPadding(sys)) - { - msg_Dbg(va, "mismatching external pool sizes use the internal one %dx%d vs %dx%d", - sys->textureWidth, sys->textureHeight, fmt->i_width, fmt->i_height); - sys->va_pool->can_extern_pool = false; - sys->textureWidth = fmt->i_width; - sys->textureHeight = fmt->i_height; - } - if (sys->totalTextureSlices && sys->totalTextureSlices < surface_count) - { - msg_Warn(va, "not enough decoding slices in the texture (%d/%d)", - sys->totalTextureSlices, surface_count); - sys->va_pool->can_extern_pool = false; - } #if VLC_WINSTORE_APP /* On the Xbox 1/S, any decoding of H264 with one dimension over 2304 * crashes totally the device */ if (codec_id == AV_CODEC_ID_H264 && - (sys->textureWidth > 2304 || sys->textureHeight > 2304) && + (fmt->i_width > 2304 || fmt->i_height > 2304) && isXboxHardware(sys->d3d_dev.d3ddevice)) { msg_Warn(va, "%dx%d resolution not supported by your hardware", fmt->i_width, fmt->i_height); @@ -752,82 +670,10 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, return VLC_EGENERIC; } - if (sys->va_pool->can_extern_pool) - { -#if !D3D11_DIRECT_DECODE - size_t surface_idx; - for (surface_idx = 0; surface_idx < surface_count; surface_idx++) { - picture_t *pic = decoder_NewPicture( (decoder_t*) vlc_object_parent(va) ); - sys->extern_pics[surface_idx] = pic; - sys->hw_surface[surface_idx] = NULL; - if (pic==NULL) - { - msg_Warn(va, "not enough decoder pictures %d out of %d", surface_idx, surface_count); - sys->va_pool->can_extern_pool = false; - break; - } - - D3D11_TEXTURE2D_DESC texDesc; - picture_sys_d3d11_t * p_sys = pic->p_sys; - ID3D11Texture2D_GetDesc(p_sys->texture[KNOWN_DXGI_INDEX], &texDesc); - assert(texDesc.Format == sys->render); - assert(texDesc.BindFlags & D3D11_BIND_DECODER); - -#if !LIBAVCODEC_VERSION_CHECK( 57, 27, 2, 61, 102 ) - if (p_sys->slice_index != surface_idx) - { - msg_Warn(va, "d3d11va requires decoding slices to be the first in the texture (%d/%d)", - p_sys->slice_index, surface_idx); - sys->va_pool->can_extern_pool = false; - break; - } -#endif - - viewDesc.Texture2D.ArraySlice = p_sys->slice_index; - hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( sys->d3ddec, - p_sys->resource[KNOWN_DXGI_INDEX], - &viewDesc, - &p_sys->decoder ); - if (FAILED(hr)) { - msg_Warn(va, "CreateVideoDecoderOutputView %d failed. (hr=0x%lX)", surface_idx, hr); - sys->va_pool->can_extern_pool = false; - break; - } - - D3D11_AllocateResourceView(va, sys->d3d_dev.d3ddevice, textureFmt, pic->p_sys->texture, pic->p_sys->slice_index, pic->p_sys->renderSrc); - - sys->hw_surface[surface_idx] = p_sys->decoder; - } - - if (!sys->va_pool->can_extern_pool) - { - for (size_t i = 0; i < surface_idx; ++i) - { - if (sys->hw_surface[i]) - { - ID3D11VideoDecoderOutputView_Release(sys->hw_surface[i]); - sys->hw_surface[i] = NULL; - } - if (sys->extern_pics[i]) - { - picture_sys_d3d11_t *p_sys = sys->extern_pics[i]->p_sys; - p_sys->decoder = NULL; - picture_Release(sys->extern_pics[i]); - sys->extern_pics[i] = NULL; - } - } - } - else -#endif - msg_Dbg(va, "using external surface pool"); - } - - if (!sys->va_pool->can_extern_pool) - { D3D11_TEXTURE2D_DESC texDesc; ZeroMemory(&texDesc, sizeof(texDesc)); - texDesc.Width = sys->textureWidth; - texDesc.Height = sys->textureHeight; + texDesc.Width = fmt->i_width; + texDesc.Height = fmt->i_height; texDesc.MipLevels = 1; texDesc.Format = sys->render; texDesc.SampleDesc.Count = 1; @@ -849,7 +695,6 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, unsigned surface_idx; for (surface_idx = 0; surface_idx < surface_count; surface_idx++) { - sys->extern_pics[surface_idx] = NULL; viewDesc.Texture2D.ArraySlice = surface_idx; hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( sys->d3ddec, @@ -869,7 +714,6 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, &sys->renderSrc[surface_idx * D3D11_MAX_SHADER_VIEW]); } } - } msg_Dbg(va, "ID3D11VideoDecoderOutputView succeed with %d surfaces (%dx%d)", surface_count, fmt->i_width, fmt->i_height); @@ -945,7 +789,7 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id, static void DxDestroySurfaces(vlc_va_sys_t *sys) { - if (sys->va_pool->surface_count && !sys->va_pool->can_extern_pool) { + if (sys->va_pool->surface_count) { ID3D11Resource *p_texture; ID3D11VideoDecoderOutputView_GetResource( sys->hw_surface[0], &p_texture ); ID3D11Resource_Release(p_texture); diff --git a/modules/video_chroma/d3d11_fmt.c b/modules/video_chroma/d3d11_fmt.c index 5ebec70a54..208efb4a05 100644 --- a/modules/video_chroma/d3d11_fmt.c +++ b/modules/video_chroma/d3d11_fmt.c @@ -418,33 +418,6 @@ bool isXboxHardware(ID3D11Device *d3ddev) return result; } -static bool isNvidiaHardware(ID3D11Device *d3ddev) -{ - IDXGIAdapter *p_adapter = D3D11DeviceAdapter(d3ddev); - if (!p_adapter) - return false; - - DXGI_ADAPTER_DESC adapterDesc; - if (FAILED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) - adapterDesc.VendorId = 0; - IDXGIAdapter_Release(p_adapter); - - return adapterDesc.VendorId == GPU_MANUFACTURER_NVIDIA; -} - -bool CanUseVoutPool(d3d11_device_t *d3d_dev, UINT slices) -{ -#if VLC_WINSTORE_APP - /* Phones and the Xbox are memory constrained, rely on the d3d11va pool - * which is always smaller, we still get direct rendering from the decoder */ - return false; -#else - /* NVIDIA cards crash when calling CreateVideoDecoderOutputView - * on more than 30 slices */ - return slices <= 30 || !isNvidiaHardware(d3d_dev->d3ddevice); -#endif -} - /** * Performs a check on each value of the WDDM version. Any value that is OK will * consider the driver valid (OR on each value) diff --git a/modules/video_chroma/d3d11_fmt.h b/modules/video_chroma/d3d11_fmt.h index 8974845cb8..44b254653d 100644 --- a/modules/video_chroma/d3d11_fmt.h +++ b/modules/video_chroma/d3d11_fmt.h @@ -170,7 +170,6 @@ int D3D11_Create(vlc_object_t *, d3d11_handle_t *, bool with_shaders); void D3D11_Destroy(d3d11_handle_t *); bool isXboxHardware(ID3D11Device *d3ddev); -bool CanUseVoutPool(d3d11_device_t *, UINT slices); IDXGIAdapter *D3D11DeviceAdapter(ID3D11Device *d3ddev); int D3D11CheckDriverVersion(d3d11_device_t *, UINT vendorId, const struct wddm_version *min_ver); diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c index 94c6d7fbfd..c73c1d3682 100644 --- a/modules/video_output/win32/direct3d11.c +++ b/modules/video_output/win32/direct3d11.c @@ -424,9 +424,8 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size) ID3D11Texture2D *textures[pool_size * D3D11_MAX_SHADER_VIEW]; memset(textures, 0, sizeof(textures)); unsigned slices = pool_size; - if (!CanUseVoutPool(&sys->d3d_dev, pool_size)) - /* only provide enough for the filters, we can still do direct rendering */ - slices = __MIN(slices, 6); + /* only provide enough for the filters, we can still do direct rendering */ + slices = __MIN(slices, 6); if (AllocateTextures(vd, &sys->d3d_dev, sys->picQuad.textureFormat, &sys->area.texture_source, slices, textures, NULL)) goto error; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
