[vlc-commits] direct3d11: align GPU surfaces to 128 octets, the max required for any codec
Steve Lhomme
git at videolan.org
Thu Apr 13 14:56:35 CEST 2017
vlc | branch: master | Steve Lhomme <robUx4 at videolabs.io> | Thu Mar 30 10:17:32 2017 +0200| [50e70cec2a9d505113af58633507a3ba0a1343f9] | committer: Jean-Baptiste Kempf
direct3d11: align GPU surfaces to 128 octets, the max required for any codec
Fixes #17856
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=50e70cec2a9d505113af58633507a3ba0a1343f9
---
modules/video_output/win32/direct3d11.c | 41 ++++++++++++++++-----------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 23c27daa2c..81cb9d51db 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -683,15 +683,6 @@ static int AllocateTextures(vout_display_t *vd, const d3d_format_t *cfg,
texDesc.ArraySize = pool_size;
texDesc.Height = fmt->i_height;
texDesc.Width = fmt->i_width;
- /* add an extra line if needed, it will be cropped on display */
- if (cfg->formatTexture == DXGI_FORMAT_NV12 || cfg->formatTexture == DXGI_FORMAT_P010)
- {
- texDesc.Width = (texDesc.Width + 1) & ~1;
- texDesc.Height = (texDesc.Height + 1) & ~1;
- }
- /* this is the actual decoding size that will be used */
- fmt->i_height = texDesc.Height;
- fmt->i_width = texDesc.Width;
hr = ID3D11Device_CreateTexture2D( sys->d3ddevice, &texDesc, NULL, &slicedTexture );
if (FAILED(hr)) {
@@ -756,7 +747,15 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
if (vd->info.is_slow)
pool_size = 1;
- if (AllocateTextures(vd, sys->picQuadConfig, &vd->fmt, pool_size, textures))
+ video_format_t surface_fmt = vd->fmt;
+ if (is_d3d11_opaque(surface_fmt.i_chroma))
+ {
+ /* worst case scenario we need 128 alignment for HEVC */
+ surface_fmt.i_width = (surface_fmt.i_width + 0x7F) & ~0x7F;
+ surface_fmt.i_height = (surface_fmt.i_height + 0x7F) & ~0x7F;
+ }
+
+ if (AllocateTextures(vd, sys->picQuadConfig, &surface_fmt, pool_size, textures))
goto error;
if (vd->info.is_slow) {
@@ -765,7 +764,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
.pf_destroy = DestroyDisplayPoolPicture,
};
- picture = picture_NewFromResource(&vd->fmt, &resource);
+ picture = picture_NewFromResource(&surface_fmt, &resource);
if (likely(picture != NULL)) {
pool_cfg.picture = &picture;
pool_cfg.lock = Direct3D11MapPoolTexture;
@@ -802,7 +801,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
.pf_destroy = DestroyDisplayPoolPicture,
};
- picture = picture_NewFromResource(&vd->fmt, &resource);
+ picture = picture_NewFromResource(&surface_fmt, &resource);
if (unlikely(picture == NULL)) {
free(picsys);
msg_Err( vd, "Failed to create picture %d in the pool.", picture_count );
@@ -815,11 +814,11 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
}
#ifdef HAVE_ID3D11VIDEODECODER
- if (!is_d3d11_opaque(vd->fmt.i_chroma) || sys->legacy_shader)
+ if (!is_d3d11_opaque(surface_fmt.i_chroma) || sys->legacy_shader)
{
/* we need a staging texture */
video_format_t staging_fmt;
- video_format_Copy(&staging_fmt, &vd->fmt);
+ video_format_Copy(&staging_fmt, &surface_fmt);
staging_fmt.i_width = staging_fmt.i_visible_width;
staging_fmt.i_height = staging_fmt.i_visible_height;
if (AllocateTextures(vd, sys->picQuadConfig, &staging_fmt, 1, textures))
@@ -838,10 +837,10 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
} else
#endif
{
- sys->picQuad.i_x_offset = vd->fmt.i_x_offset;
- sys->picQuad.i_y_offset = vd->fmt.i_y_offset;
- sys->picQuad.i_width = vd->fmt.i_width;
- sys->picQuad.i_height = vd->fmt.i_height;
+ sys->picQuad.i_x_offset = surface_fmt.i_x_offset;
+ sys->picQuad.i_y_offset = surface_fmt.i_y_offset;
+ sys->picQuad.i_width = surface_fmt.i_width;
+ sys->picQuad.i_height = surface_fmt.i_height;
for (picture_count = 0; picture_count < pool_size; picture_count++) {
if (AllocateShaderView(vd, sys->picQuadConfig, picture_count, pictures[picture_count]->p_sys))
@@ -849,8 +848,8 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
}
}
- if (SetupQuad( vd, &vd->fmt, &sys->picQuad, sys->picQuadConfig, sys->picQuadPixelShader,
- vd->fmt.projection_mode) != VLC_SUCCESS) {
+ if (SetupQuad( vd, &surface_fmt, &sys->picQuad, sys->picQuadConfig, sys->picQuadPixelShader,
+ surface_fmt.projection_mode) != VLC_SUCCESS) {
msg_Err(vd, "Could not Create the main quad picture.");
return NULL;
}
@@ -877,7 +876,7 @@ error:
sys->sys.pool = picture_pool_NewExtended( &pool_cfg );
} else {
msg_Dbg(vd, "ID3D11VideoDecoderOutputView succeed with %d surfaces (%dx%d) context 0x%p",
- picture_count, vd->fmt.i_width, vd->fmt.i_height, sys->d3dcontext);
+ picture_count, surface_fmt.i_width, surface_fmt.i_height, sys->d3dcontext);
}
return sys->sys.pool;
}
More information about the vlc-commits
mailing list