[vlc-devel] [PATCH 06/11] direct3d11: move is_d3d11_opaque() and AllocateTextures() in d3d11_fmt
Steve Lhomme
robux4 at videolabs.io
Thu Nov 16 11:38:52 CET 2017
---
modules/video_chroma/d3d11_fmt.c | 115 +++++++++++++++++++++++++++++
modules/video_chroma/d3d11_fmt.h | 10 +++
modules/video_output/win32/direct3d11.c | 127 --------------------------------
3 files changed, 125 insertions(+), 127 deletions(-)
diff --git a/modules/video_chroma/d3d11_fmt.c b/modules/video_chroma/d3d11_fmt.c
index 7ae6fecee2..e3b5e4e0cd 100644
--- a/modules/video_chroma/d3d11_fmt.c
+++ b/modules/video_chroma/d3d11_fmt.c
@@ -283,3 +283,118 @@ const d3d_format_t *FindD3D11Format(ID3D11Device *d3ddevice,
}
return NULL;
}
+
+int AllocateTextures( vlc_object_t *obj, d3d11_handle_t *hd3d11,
+ const d3d_format_t *cfg, const video_format_t *fmt,
+ unsigned pool_size, ID3D11Texture2D *textures[] )
+{
+ plane_t planes[PICTURE_PLANE_MAX];
+ int plane, plane_count;
+ HRESULT hr;
+ ID3D11Texture2D *slicedTexture = NULL;
+ D3D11_TEXTURE2D_DESC texDesc;
+ ZeroMemory(&texDesc, sizeof(texDesc));
+ texDesc.MipLevels = 1;
+ texDesc.SampleDesc.Count = 1;
+ texDesc.MiscFlags = 0; //D3D11_RESOURCE_MISC_SHARED;
+ texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
+ if (is_d3d11_opaque(fmt->i_chroma)) {
+ texDesc.BindFlags |= D3D11_BIND_DECODER;
+ texDesc.Usage = D3D11_USAGE_DEFAULT;
+ texDesc.CPUAccessFlags = 0;
+ } else {
+ texDesc.Usage = D3D11_USAGE_DYNAMIC;
+ texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ }
+ texDesc.ArraySize = pool_size;
+
+ const vlc_chroma_description_t *p_chroma_desc = vlc_fourcc_GetChromaDescription( fmt->i_chroma );
+ if( !p_chroma_desc )
+ return VLC_EGENERIC;
+
+ if (cfg->formatTexture == DXGI_FORMAT_UNKNOWN) {
+ if (p_chroma_desc->plane_count == 0)
+ {
+ msg_Dbg(obj, "failed to get the pixel format planes for %4.4s", (char *)&fmt->i_chroma);
+ return VLC_EGENERIC;
+ }
+ assert(p_chroma_desc->plane_count <= D3D11_MAX_SHADER_VIEW);
+ plane_count = p_chroma_desc->plane_count;
+
+ texDesc.Format = cfg->resourceFormat[0];
+ assert(cfg->resourceFormat[1] == cfg->resourceFormat[0]);
+ assert(cfg->resourceFormat[2] == cfg->resourceFormat[0]);
+
+ for( int i = 0; i < plane_count; i++ )
+ {
+ plane_t *p = &planes[i];
+
+ p->i_lines = fmt->i_height * p_chroma_desc->p[i].h.num / p_chroma_desc->p[i].h.den;
+ p->i_visible_lines = fmt->i_visible_height * p_chroma_desc->p[i].h.num / p_chroma_desc->p[i].h.den;
+ p->i_pitch = fmt->i_width * p_chroma_desc->p[i].w.num / p_chroma_desc->p[i].w.den * p_chroma_desc->pixel_size;
+ p->i_visible_pitch = fmt->i_visible_width * p_chroma_desc->p[i].w.num / p_chroma_desc->p[i].w.den * p_chroma_desc->pixel_size;
+ p->i_pixel_pitch = p_chroma_desc->pixel_size;
+ }
+ } else {
+ plane_count = 1;
+ texDesc.Format = cfg->formatTexture;
+ texDesc.Height = fmt->i_height;
+ texDesc.Width = fmt->i_width;
+
+ hr = ID3D11Device_CreateTexture2D( hd3d11->d3ddevice, &texDesc, NULL, &slicedTexture );
+ if (FAILED(hr)) {
+ msg_Err(obj, "CreateTexture2D failed for the %d pool. (hr=0x%0lx)", pool_size, hr);
+ goto error;
+ }
+ }
+
+ for (unsigned picture_count = 0; picture_count < pool_size; picture_count++) {
+ for (plane = 0; plane < plane_count; plane++)
+ {
+ if (slicedTexture) {
+ textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = slicedTexture;
+ ID3D11Texture2D_AddRef(slicedTexture);
+ } else {
+ texDesc.Height = planes[plane].i_lines;
+ texDesc.Width = planes[plane].i_pitch;
+ hr = ID3D11Device_CreateTexture2D( hd3d11->d3ddevice, &texDesc, NULL, &textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] );
+ if (FAILED(hr)) {
+ msg_Err(obj, "CreateTexture2D failed for the %d pool. (hr=0x%0lx)", pool_size, hr);
+ goto error;
+ }
+ }
+ }
+ for (; plane < D3D11_MAX_SHADER_VIEW; plane++) {
+ if (!cfg->resourceFormat[plane])
+ textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = NULL;
+ else
+ {
+ textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = textures[picture_count * D3D11_MAX_SHADER_VIEW];
+ ID3D11Texture2D_AddRef(textures[picture_count * D3D11_MAX_SHADER_VIEW + plane]);
+ }
+ }
+ }
+
+ if (!is_d3d11_opaque(fmt->i_chroma) && cfg->formatTexture != DXGI_FORMAT_UNKNOWN) {
+ D3D11_MAPPED_SUBRESOURCE mappedResource;
+ hr = ID3D11DeviceContext_Map(hd3d11->d3dcontext, (ID3D11Resource*)textures[0], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ if( FAILED(hr) ) {
+ msg_Err(obj, "The texture cannot be mapped. (hr=0x%lX)", hr);
+ goto error;
+ }
+ ID3D11DeviceContext_Unmap(hd3d11->d3dcontext, (ID3D11Resource*)textures[0], 0);
+ if (mappedResource.RowPitch < p_chroma_desc->pixel_size * texDesc.Width) {
+ msg_Err( obj, "The texture row pitch is too small (%d instead of %d)", mappedResource.RowPitch,
+ p_chroma_desc->pixel_size * texDesc.Width );
+ goto error;
+ }
+ }
+
+ if (slicedTexture)
+ ID3D11Texture2D_Release(slicedTexture);
+ return VLC_SUCCESS;
+error:
+ if (slicedTexture)
+ ID3D11Texture2D_Release(slicedTexture);
+ return VLC_EGENERIC;
+}
diff --git a/modules/video_chroma/d3d11_fmt.h b/modules/video_chroma/d3d11_fmt.h
index 1f17d490b8..bdc886c9b6 100644
--- a/modules/video_chroma/d3d11_fmt.h
+++ b/modules/video_chroma/d3d11_fmt.h
@@ -59,6 +59,12 @@ picture_sys_t *ActivePictureSys(picture_t *p_pic);
* (ie not DXGI_FORMAT_UNKNWON) */
#define KNOWN_DXGI_INDEX 0
+static inline bool is_d3d11_opaque(vlc_fourcc_t chroma)
+{
+ return chroma == VLC_CODEC_D3D11_OPAQUE ||
+ chroma == VLC_CODEC_D3D11_OPAQUE_10B;
+}
+
void AcquirePictureSys(picture_sys_t *p_sys);
void ReleasePictureSys(picture_sys_t *p_sys);
@@ -92,4 +98,8 @@ const d3d_format_t *FindD3D11Format(ID3D11Device *d3ddevice,
bool allow_opaque,
UINT supportFlags);
+int AllocateTextures(vlc_object_t *obj, d3d11_handle_t *hd3d11,
+ const d3d_format_t *cfg, const video_format_t *fmt,
+ unsigned pool_size, ID3D11Texture2D *textures[]);
+
#endif /* include-guard */
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 338eb67d8e..73e627ef35 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -476,18 +476,6 @@ static int OpenCoreW(vout_display_t *vd)
}
#endif
-static bool is_d3d11_opaque(vlc_fourcc_t chroma)
-{
- switch (chroma)
- {
- case VLC_CODEC_D3D11_OPAQUE:
- case VLC_CODEC_D3D11_OPAQUE_10B:
- return true;
- default:
- return false;
- }
-}
-
#if VLC_WINSTORE_APP
static bool GetRect(const vout_display_sys_win32_t *p_sys, RECT *out)
{
@@ -580,121 +568,6 @@ static void Close(vlc_object_t *object)
free(vd->sys);
}
-static int AllocateTextures(vlc_object_t *obj, d3d11_handle_t *hd3d11,
- const d3d_format_t *cfg, const video_format_t *fmt,
- unsigned pool_size, ID3D11Texture2D *textures[])
-{
- plane_t planes[PICTURE_PLANE_MAX];
- int plane, plane_count;
- HRESULT hr;
- ID3D11Texture2D *slicedTexture = NULL;
- D3D11_TEXTURE2D_DESC texDesc;
- ZeroMemory(&texDesc, sizeof(texDesc));
- texDesc.MipLevels = 1;
- texDesc.SampleDesc.Count = 1;
- texDesc.MiscFlags = 0; //D3D11_RESOURCE_MISC_SHARED;
- texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- if (is_d3d11_opaque(fmt->i_chroma)) {
- texDesc.BindFlags |= D3D11_BIND_DECODER;
- texDesc.Usage = D3D11_USAGE_DEFAULT;
- texDesc.CPUAccessFlags = 0;
- } else {
- texDesc.Usage = D3D11_USAGE_DYNAMIC;
- texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- }
- texDesc.ArraySize = pool_size;
-
- const vlc_chroma_description_t *p_chroma_desc = vlc_fourcc_GetChromaDescription( fmt->i_chroma );
- if( !p_chroma_desc )
- return VLC_EGENERIC;
-
- if (cfg->formatTexture == DXGI_FORMAT_UNKNOWN) {
- if (p_chroma_desc->plane_count == 0)
- {
- msg_Dbg(obj, "failed to get the pixel format planes for %4.4s", (char *)&fmt->i_chroma);
- return VLC_EGENERIC;
- }
- assert(p_chroma_desc->plane_count <= D3D11_MAX_SHADER_VIEW);
- plane_count = p_chroma_desc->plane_count;
-
- texDesc.Format = cfg->resourceFormat[0];
- assert(cfg->resourceFormat[1] == cfg->resourceFormat[0]);
- assert(cfg->resourceFormat[2] == cfg->resourceFormat[0]);
-
- for( int i = 0; i < plane_count; i++ )
- {
- plane_t *p = &planes[i];
-
- p->i_lines = fmt->i_height * p_chroma_desc->p[i].h.num / p_chroma_desc->p[i].h.den;
- p->i_visible_lines = fmt->i_visible_height * p_chroma_desc->p[i].h.num / p_chroma_desc->p[i].h.den;
- p->i_pitch = fmt->i_width * p_chroma_desc->p[i].w.num / p_chroma_desc->p[i].w.den * p_chroma_desc->pixel_size;
- p->i_visible_pitch = fmt->i_visible_width * p_chroma_desc->p[i].w.num / p_chroma_desc->p[i].w.den * p_chroma_desc->pixel_size;
- p->i_pixel_pitch = p_chroma_desc->pixel_size;
- }
- } else {
- plane_count = 1;
- texDesc.Format = cfg->formatTexture;
- texDesc.Height = fmt->i_height;
- texDesc.Width = fmt->i_width;
-
- hr = ID3D11Device_CreateTexture2D( hd3d11->d3ddevice, &texDesc, NULL, &slicedTexture );
- if (FAILED(hr)) {
- msg_Err(obj, "CreateTexture2D failed for the %d pool. (hr=0x%0lx)", pool_size, hr);
- goto error;
- }
- }
-
- for (unsigned picture_count = 0; picture_count < pool_size; picture_count++) {
- for (plane = 0; plane < plane_count; plane++)
- {
- if (slicedTexture) {
- textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = slicedTexture;
- ID3D11Texture2D_AddRef(slicedTexture);
- } else {
- texDesc.Height = planes[plane].i_lines;
- texDesc.Width = planes[plane].i_pitch;
- hr = ID3D11Device_CreateTexture2D( hd3d11->d3ddevice, &texDesc, NULL, &textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] );
- if (FAILED(hr)) {
- msg_Err(obj, "CreateTexture2D failed for the %d pool. (hr=0x%0lx)", pool_size, hr);
- goto error;
- }
- }
- }
- for (; plane < D3D11_MAX_SHADER_VIEW; plane++) {
- if (!cfg->resourceFormat[plane])
- textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = NULL;
- else
- {
- textures[picture_count * D3D11_MAX_SHADER_VIEW + plane] = textures[picture_count * D3D11_MAX_SHADER_VIEW];
- ID3D11Texture2D_AddRef(textures[picture_count * D3D11_MAX_SHADER_VIEW + plane]);
- }
- }
- }
-
- if (!is_d3d11_opaque(fmt->i_chroma) && cfg->formatTexture != DXGI_FORMAT_UNKNOWN) {
- D3D11_MAPPED_SUBRESOURCE mappedResource;
- hr = ID3D11DeviceContext_Map(hd3d11->d3dcontext, (ID3D11Resource*)textures[0], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if( FAILED(hr) ) {
- msg_Err(obj, "The texture cannot be mapped. (hr=0x%lX)", hr);
- goto error;
- }
- ID3D11DeviceContext_Unmap(hd3d11->d3dcontext, (ID3D11Resource*)textures[0], 0);
- if (mappedResource.RowPitch < p_chroma_desc->pixel_size * texDesc.Width) {
- msg_Err( obj, "The texture row pitch is too small (%d instead of %d)", mappedResource.RowPitch,
- p_chroma_desc->pixel_size * texDesc.Width );
- goto error;
- }
- }
-
- if (slicedTexture)
- ID3D11Texture2D_Release(slicedTexture);
- return VLC_SUCCESS;
-error:
- if (slicedTexture)
- ID3D11Texture2D_Release(slicedTexture);
- return VLC_EGENERIC;
-}
-
static picture_pool_t *Pool(vout_display_t *vd, unsigned pool_size)
{
/* compensate for extra hardware decoding pulling extra pictures from our pool */
--
2.14.2
More information about the vlc-devel
mailing list