On Sat, May 9, 2020 at 2:12 AM Soft Works <softwo...@hotmail.com> wrote: > > > From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> On Behalf Of > > Hendrik Leppkes > > Sent: Friday, May 8, 2020 10:27 PM > > To: FFmpeg development discussions and patches <ffmpeg- > > de...@ffmpeg.org> > > Subject: Re: [FFmpeg-devel] [PATCH v4 03/11] libavutil/hwcontext_d3d11va: > > adding more texture information to the D3D11 hwcontext API > > > > On Fri, May 8, 2020 at 5:51 PM <artem.ga...@gmail.com> wrote: > > > > > > From: Artem Galin <artem.ga...@intel.com> > > > > > > Added AVD3D11FrameDescriptors array to store array of single textures > > > in case if there is no way to allocate array texture with BindFlags = > > D3D11_BIND_RENDER_TARGET. > > > > > > Signed-off-by: Artem Galin <artem.ga...@intel.com> > > > --- > > > libavutil/hwcontext_d3d11va.c | 26 ++++++++++++++++++++------ > > > libavutil/hwcontext_d3d11va.h | 9 +++++++++ > > > 2 files changed, 29 insertions(+), 6 deletions(-) > > > > > > diff --git a/libavutil/hwcontext_d3d11va.c > > > b/libavutil/hwcontext_d3d11va.c index c8ae58f908..cd80931dd3 100644 > > > --- a/libavutil/hwcontext_d3d11va.c > > > +++ b/libavutil/hwcontext_d3d11va.c > > > @@ -72,8 +72,8 @@ static av_cold void load_functions(void) } > > > > > > typedef struct D3D11VAFramesContext { > > > - int nb_surfaces_used; > > > - > > > + size_t nb_surfaces; > > > + size_t nb_surfaces_used; > > > DXGI_FORMAT format; > > > > > > ID3D11Texture2D *staging_texture; @@ -112,6 +112,8 @@ static void > > > d3d11va_frames_uninit(AVHWFramesContext *ctx) > > > if (s->staging_texture) > > > ID3D11Texture2D_Release(s->staging_texture); > > > s->staging_texture = NULL; > > > + > > > + av_freep(&frames_hwctx->texture_infos); > > > } > > > > > > static int d3d11va_frames_get_constraints(AVHWDeviceContext *ctx, @@ > > > -152,8 +154,10 @@ static void free_texture(void *opaque, uint8_t *data) > > > av_free(data); > > > } > > > > > > -static AVBufferRef *wrap_texture_buf(ID3D11Texture2D *tex, int index) > > > +static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, > > > +ID3D11Texture2D *tex, int index) > > > { > > > + D3D11VAFramesContext *s = ctx->internal->priv; > > > + AVD3D11VAFramesContext *frames_hwctx = ctx->hwctx; > > > AVBufferRef *buf; > > > AVD3D11FrameDescriptor *desc = av_mallocz(sizeof(*desc)); > > > if (!desc) { > > > @@ -161,6 +165,10 @@ static AVBufferRef > > *wrap_texture_buf(ID3D11Texture2D *tex, int index) > > > return NULL; > > > } > > > > > > + frames_hwctx->texture_infos[s->nb_surfaces_used].texture = tex; > > > + frames_hwctx->texture_infos[s->nb_surfaces_used].index = index; > > > + s->nb_surfaces_used++; > > > + > > > desc->texture = tex; > > > desc->index = index; > > > > > > @@ -199,7 +207,7 @@ static AVBufferRef > > *d3d11va_alloc_single(AVHWFramesContext *ctx) > > > return NULL; > > > } > > > > > > - return wrap_texture_buf(tex, 0); > > > + return wrap_texture_buf(ctx, tex, 0); > > > } > > > > > > static AVBufferRef *d3d11va_pool_alloc(void *opaque, int size) @@ > > > -220,7 +228,7 @@ static AVBufferRef *d3d11va_pool_alloc(void *opaque, > > int size) > > > } > > > > > > ID3D11Texture2D_AddRef(hwctx->texture); > > > - return wrap_texture_buf(hwctx->texture, s->nb_surfaces_used++); > > > + return wrap_texture_buf(ctx, hwctx->texture, > > > + s->nb_surfaces_used); > > > } > > > > > > static int d3d11va_frames_init(AVHWFramesContext *ctx) @@ -267,7 > > > +275,7 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx) > > > av_log(ctx, AV_LOG_ERROR, "User-provided texture has > > mismatching parameters\n"); > > > return AVERROR(EINVAL); > > > } > > > - } else if (texDesc.ArraySize > 0) { > > > + } else if (!(texDesc.BindFlags & D3D11_BIND_RENDER_TARGET) && > > > + texDesc.ArraySize > 0) { > > > hr = ID3D11Device_CreateTexture2D(device_hwctx->device, > > &texDesc, NULL, &hwctx->texture); > > > if (FAILED(hr)) { > > > av_log(ctx, AV_LOG_ERROR, "Could not create the texture > > > (%lx)\n", (long)hr); @@ -275,6 +283,12 @@ static int > > d3d11va_frames_init(AVHWFramesContext *ctx) > > > } > > > } > > > > > > + hwctx->texture_infos = av_mallocz_array(ctx->initial_pool_size, > > sizeof(*hwctx->texture_infos)); > > > + if (!hwctx->texture_infos) > > > + return AVERROR(ENOMEM); > > > + > > > + s->nb_surfaces = ctx->initial_pool_size; > > > + > > > ctx->internal->pool_internal = > > av_buffer_pool_init2(sizeof(AVD3D11FrameDescriptor), > > > ctx, > > > d3d11va_pool_alloc, NULL); > > > if (!ctx->internal->pool_internal) diff --git > > > a/libavutil/hwcontext_d3d11va.h b/libavutil/hwcontext_d3d11va.h index > > > 9f91e9b1b6..295bdcd90d 100644 > > > --- a/libavutil/hwcontext_d3d11va.h > > > +++ b/libavutil/hwcontext_d3d11va.h > > > @@ -164,6 +164,15 @@ typedef struct AVD3D11VAFramesContext { > > > * This field is ignored/invalid if a user-allocated texture is > > > provided. > > > */ > > > UINT MiscFlags; > > > + > > > + /** > > > + * In case if texture structure member above is not NULL contains the > > same texture > > > + * pointer for all elements and different indexes into the array > > > texture. > > > + * In case if texture structure member above is NULL, all elements > > contains > > > + * pointers to separate non-array textures and 0 indexes. > > > + * This field is ignored/invalid if a user-allocated texture is > > > provided. > > > + */ > > > + AVD3D11FrameDescriptor *texture_infos; > > > } AVD3D11VAFramesContext; > > > > > > > > > I'm not really a fan of this. Only supporting array textures was an > > intentional > > design decision back when D3D11VA was defined, because it greatly > > simplified the entire design - and as far as I know the d3d11va decoder, for > > example, doesnt even support decoding into anything else. > > > > - Hendrik > > It's not like there would be a choice. The Intel MSDK uses an allocator > mechanism > and when it asks for a non-array DX11 texture it has to be given one. >
Of course there is a choice. Only support the new stuff. Afterall we havent supported it at all for years now, so only supporting it on newer drivers isn't the end of the world. - 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".