[vlc-devel] [PATCH] d3d11_player: use a different ID3D11Device between the app and VLC
Steve Lhomme
robux4 at ycbcr.xyz
Mon Oct 7 16:31:55 CEST 2019
This is already merged and should not have been in this patch folder...
On 2019-10-07 16:28, Steve Lhomme wrote:
> The texture we render to is shared between the 2 devices and locked internally
> by the driver when needed.
> ---
> doc/libvlc/d3d11_player.cpp | 55 ++++++++++++++++++++++++++++---------
> 1 file changed, 42 insertions(+), 13 deletions(-)
>
> diff --git a/doc/libvlc/d3d11_player.cpp b/doc/libvlc/d3d11_player.cpp
> index a94fe793f3d..2ae4967f5e4 100644
> --- a/doc/libvlc/d3d11_player.cpp
> +++ b/doc/libvlc/d3d11_player.cpp
> @@ -4,6 +4,9 @@
> #include <d3d11.h>
> #include <d3dcompiler.h>
>
> +#include <d3d11_1.h>
> +#include <dxgi1_2.h>
> +
> #include <vlc/vlc.h>
>
> #define SCREEN_WIDTH 1500
> @@ -15,6 +18,13 @@
>
> struct render_context
> {
> + /* resources shared by VLC */
> + ID3D11Device *d3deviceVLC;
> + ID3D11DeviceContext *d3dctxVLC;
> + ID3D11Texture2D *textureVLC; // shared between VLC and the app
> + HANDLE sharedHandled; // handle of the texture used by VLC and the app
> + ID3D11RenderTargetView *textureRenderTarget;
> +
> /* Direct3D11 device/context */
> ID3D11Device *d3device;
> ID3D11DeviceContext *d3dctx;
> @@ -38,7 +48,6 @@ struct render_context
> /* texture VLC renders into */
> ID3D11Texture2D *texture;
> ID3D11ShaderResourceView *textureShaderInput;
> - ID3D11RenderTargetView *textureRenderTarget;
>
> CRITICAL_SECTION sizeLock; // the ReportSize callback cannot be called during/after the Cleanup_cb is called
> unsigned width, height;
> @@ -59,6 +68,11 @@ static bool UpdateOutput_cb( void *opaque, const libvlc_video_direct3d_cfg_t *cf
> ctx->texture->Release();
> ctx->texture = NULL;
> }
> + if (ctx->textureVLC)
> + {
> + ctx->textureVLC->Release();
> + ctx->textureVLC = NULL;
> + }
> if (ctx->textureShaderInput)
> {
> ctx->textureShaderInput->Release();
> @@ -82,10 +96,21 @@ static bool UpdateOutput_cb( void *opaque, const libvlc_video_direct3d_cfg_t *cf
> texDesc.Format = renderFormat;
> texDesc.Height = cfg->height;
> texDesc.Width = cfg->width;
> + texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
>
> hr = ctx->d3device->CreateTexture2D( &texDesc, NULL, &ctx->texture );
> if (FAILED(hr)) return false;
>
> + IDXGIResource1* sharedResource = NULL;
> + ctx->texture->QueryInterface(__uuidof(IDXGIResource1), (LPVOID*) &sharedResource);
> + hr = sharedResource->CreateSharedHandle(NULL, DXGI_SHARED_RESOURCE_READ, NULL, &ctx->sharedHandled);
> + sharedResource->Release();
> +
> + ID3D11Device1* d3d11VLC1;
> + ctx->d3deviceVLC->QueryInterface(__uuidof(ID3D11Device1), (LPVOID*) &d3d11VLC1);
> + hr = d3d11VLC1->OpenSharedResource1(ctx->sharedHandled, __uuidof(ID3D11Texture2D), (void**)&ctx->textureVLC);
> + d3d11VLC1->Release();
> +
> D3D11_SHADER_RESOURCE_VIEW_DESC resviewDesc;
> ZeroMemory(&resviewDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
> resviewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
> @@ -98,7 +123,7 @@ static bool UpdateOutput_cb( void *opaque, const libvlc_video_direct3d_cfg_t *cf
> .Format = texDesc.Format,
> .ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D,
> };
> - hr = ctx->d3device->CreateRenderTargetView(ctx->texture, &renderTargetViewDesc, &ctx->textureRenderTarget);
> + hr = ctx->d3deviceVLC->CreateRenderTargetView(ctx->textureVLC, &renderTargetViewDesc, &ctx->textureRenderTarget);
> if (FAILED(hr)) return false;
>
>
> @@ -162,14 +187,7 @@ static bool StartRendering_cb( void *opaque, bool enter, const libvlc_video_dire
> if ( enter )
> {
> static const FLOAT blackRGBA[4] = {0.5f, 0.5f, 0.0f, 1.0f};
> -
> - /* force unbinding the input texture, otherwise we get:
> - * OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! */
> - ID3D11ShaderResourceView *reset = NULL;
> - ctx->d3dctx->PSSetShaderResources(0, 1, &reset);
> - //ctx->d3dctx->Flush();
> -
> - ctx->d3dctx->ClearRenderTargetView( ctx->textureRenderTarget, blackRGBA);
> + ctx->d3dctxVLC->ClearRenderTargetView( ctx->textureRenderTarget, blackRGBA);
> return true;
> }
>
> @@ -182,14 +200,14 @@ static bool SelectPlane_cb( void *opaque, size_t plane )
> struct render_context *ctx = static_cast<struct render_context *>( opaque );
> if ( plane != 0 ) // we only support one packed RGBA plane (DXGI_FORMAT_R8G8B8A8_UNORM)
> return false;
> - ctx->d3dctx->OMSetRenderTargets( 1, &ctx->textureRenderTarget, NULL );
> + ctx->d3dctxVLC->OMSetRenderTargets( 1, &ctx->textureRenderTarget, NULL );
> return true;
> }
>
> static bool Setup_cb( void **opaque, const libvlc_video_direct3d_device_cfg_t *cfg, libvlc_video_direct3d_device_setup_t *out )
> {
> struct render_context *ctx = static_cast<struct render_context *>(*opaque);
> - out->device_context = ctx->d3dctx;
> + out->device_context = ctx->d3dctxVLC;
> return true;
> }
>
> @@ -275,7 +293,7 @@ static void init_direct3d(struct render_context *ctx, HWND hWnd)
> scd.Windowed = TRUE;
> scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
>
> - UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; /* needed for hardware decoding */
> + UINT creationFlags = 0;
> #ifndef NDEBUG
> creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
> #endif
> @@ -301,6 +319,14 @@ static void init_direct3d(struct render_context *ctx, HWND hWnd)
> pMultithread->Release();
> }
>
> + D3D11CreateDevice(NULL,
> + D3D_DRIVER_TYPE_HARDWARE,
> + NULL,
> + creationFlags | D3D11_CREATE_DEVICE_VIDEO_SUPPORT, /* needed for hardware decoding */
> + NULL, 0,
> + D3D11_SDK_VERSION,
> + &ctx->d3deviceVLC, NULL, &ctx->d3dctxVLC);
> +
> ID3D11Texture2D *pBackBuffer;
> ctx->swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
>
> @@ -384,6 +410,9 @@ static void init_direct3d(struct render_context *ctx, HWND hWnd)
>
> static void release_direct3d(struct render_context *ctx)
> {
> + ctx->d3deviceVLC->Release();
> + ctx->d3dctxVLC->Release();
> +
> ctx->samplerState->Release();
> ctx->textureRenderTarget->Release();
> ctx->textureShaderInput->Release();
> --
> 2.19.1.windows.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list