Re: [FFmpeg-devel] [PATCH] d3d11va: let user can create SRV from output

2022-03-08 Thread Hendrik Leppkes
On Wed, Mar 9, 2022 at 7:56 AM Wang Chuan  wrote:
>
> Starting from Windows 8, users can create SRV from video resource
> and bind it to shaders directly. This can avoid unnecessary memcpy
> (ID3D11DeviceContext::CopyResource, etc), so create texture with
> [D3D11_BIND_SHADER_RESOURCE] as decoder's output if possible.
>
> Signed-off-by: Wang Chuan 
> ---
>   libavcodec/dxva2.c|  2 +-
>   libavutil/hwcontext_d3d11va.c | 10 ++
>   2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
> index 568d686f39..15b25d793c 100644
> --- a/libavcodec/dxva2.c
> +++ b/libavcodec/dxva2.c
> @@ -645,7 +645,7 @@ int ff_dxva2_common_frame_params(AVCodecContext *avctx,
>   if (frames_ctx->format == AV_PIX_FMT_D3D11) {
>   AVD3D11VAFramesContext *frames_hwctx = frames_ctx->hwctx;
>   -frames_hwctx->BindFlags |= D3D11_BIND_DECODER;
> +frames_hwctx->BindFlags |= (D3D11_BIND_DECODER |
> D3D11_BIND_SHADER_RESOURCE);
>   }
>   #endif
>   diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
> index 8ab96bad25..97ffd745bd 100644
> --- a/libavutil/hwcontext_d3d11va.c
> +++ b/libavutil/hwcontext_d3d11va.c
> @@ -203,6 +203,11 @@ static AVBufferRef
> *d3d11va_alloc_single(AVHWFramesContext *ctx)
>   };
>hr = ID3D11Device_CreateTexture2D(device_hwctx->device, ,
> NULL, );
> +if (FAILED(hr) && (texDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)) {
> +av_log(ctx, AV_LOG_ERROR, "Could not create the texture with
> [D3D11_BIND_SHADER_RESOURCE] flag");
> +texDesc.BindFlags &= ~D3D11_BIND_SHADER_RESOURCE;
> +hr = ID3D11Device_CreateTexture2D(device_hwctx->device,
> , NULL, );
> +}
>   if (FAILED(hr)) {
>   av_log(ctx, AV_LOG_ERROR, "Could not create the texture
> (%lx)\n", (long)hr);
>   return NULL;
> @@ -278,6 +283,11 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)
>   }
>   } else if (!(texDesc.BindFlags & D3D11_BIND_RENDER_TARGET) &&
> texDesc.ArraySize > 0) {
>   hr = ID3D11Device_CreateTexture2D(device_hwctx->device,
> , NULL, >texture);
> +if (FAILED(hr) && (texDesc.BindFlags &
> D3D11_BIND_SHADER_RESOURCE)) {
> +av_log(ctx, AV_LOG_ERROR, "Could not create the texture
> with [D3D11_BIND_SHADER_RESOURCE] flag");
> +texDesc.BindFlags &= ~D3D11_BIND_SHADER_RESOURCE;
> +hr = ID3D11Device_CreateTexture2D(device_hwctx->device,
> , NULL, >texture);
> +}

I really don't like these fallbacks. If a caller requests a certain
set of flags, it should fullfill these, or fail, and not change them.
Especially special-casing this one flag just makes it extra iffy, and
I know why you added it, but that doesn't help.

IMHO, its also not entirely unreasonable that if you require anything
but the default flags, to let the user just manage their own frames
context, the effort required is not that high and there is never a set
of flags you can set that'll cover every use case (for example, I use
surface sharing, thats not set by default either).

- Hendrik
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] d3d11va: let user can create SRV from output

2022-03-08 Thread Wang Chuan

Starting from Windows 8, users can create SRV from video resource
and bind it to shaders directly. This can avoid unnecessary memcpy
(ID3D11DeviceContext::CopyResource, etc), so create texture with
[D3D11_BIND_SHADER_RESOURCE] as decoder's output if possible.

Signed-off-by: Wang Chuan 
---
 libavcodec/dxva2.c|  2 +-
 libavutil/hwcontext_d3d11va.c | 10 ++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 568d686f39..15b25d793c 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -645,7 +645,7 @@ int ff_dxva2_common_frame_params(AVCodecContext *avctx,
 if (frames_ctx->format == AV_PIX_FMT_D3D11) {
 AVD3D11VAFramesContext *frames_hwctx = frames_ctx->hwctx;
 -frames_hwctx->BindFlags |= D3D11_BIND_DECODER;
+frames_hwctx->BindFlags |= (D3D11_BIND_DECODER | 
D3D11_BIND_SHADER_RESOURCE);

 }
 #endif
 diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
index 8ab96bad25..97ffd745bd 100644
--- a/libavutil/hwcontext_d3d11va.c
+++ b/libavutil/hwcontext_d3d11va.c
@@ -203,6 +203,11 @@ static AVBufferRef 
*d3d11va_alloc_single(AVHWFramesContext *ctx)

 };
  hr = ID3D11Device_CreateTexture2D(device_hwctx->device, , 
NULL, );

+if (FAILED(hr) && (texDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE)) {
+av_log(ctx, AV_LOG_ERROR, "Could not create the texture with 
[D3D11_BIND_SHADER_RESOURCE] flag");

+texDesc.BindFlags &= ~D3D11_BIND_SHADER_RESOURCE;
+hr = ID3D11Device_CreateTexture2D(device_hwctx->device, 
, NULL, );

+}
 if (FAILED(hr)) {
 av_log(ctx, AV_LOG_ERROR, "Could not create the texture 
(%lx)\n", (long)hr);

 return NULL;
@@ -278,6 +283,11 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)
 }
 } else if (!(texDesc.BindFlags & D3D11_BIND_RENDER_TARGET) && 
texDesc.ArraySize > 0) {
 hr = ID3D11Device_CreateTexture2D(device_hwctx->device, 
, NULL, >texture);
+if (FAILED(hr) && (texDesc.BindFlags & 
D3D11_BIND_SHADER_RESOURCE)) {
+av_log(ctx, AV_LOG_ERROR, "Could not create the texture 
with [D3D11_BIND_SHADER_RESOURCE] flag");

+texDesc.BindFlags &= ~D3D11_BIND_SHADER_RESOURCE;
+hr = ID3D11Device_CreateTexture2D(device_hwctx->device, 
, NULL, >texture);

+}
 if (FAILED(hr)) {
 av_log(ctx, AV_LOG_ERROR, "Could not create the texture 
(%lx)\n", (long)hr);

 return AVERROR_UNKNOWN;
--
2.35.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".