vlc | branch: master | Steve Lhomme <[email protected]> | Fri Jan 29 08:03:59 2021 +0100| [aab42f50b6d72052e7736b8d618f83e5f60ad10b] | committer: Steve Lhomme
dxgi_fmt: add a function to fill black colors values for common render targets > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=aab42f50b6d72052e7736b8d618f83e5f60ad10b --- modules/video_chroma/dxgi_fmt.c | 51 ++++++++++++++++++++++++++++++ modules/video_chroma/dxgi_fmt.h | 17 ++++++++++ modules/video_output/win32/d3d11_shaders.c | 44 ++++++-------------------- 3 files changed, 77 insertions(+), 35 deletions(-) diff --git a/modules/video_chroma/dxgi_fmt.c b/modules/video_chroma/dxgi_fmt.c index 643dece81e..9597d93ccc 100644 --- a/modules/video_chroma/dxgi_fmt.c +++ b/modules/video_chroma/dxgi_fmt.c @@ -28,6 +28,8 @@ #include "dxgi_fmt.h" +#include <assert.h> + typedef struct { const char *name; @@ -188,3 +190,52 @@ bool DxgiIsRGBFormat(const d3d_format_t *cfg) cfg->formatTexture != DXGI_FORMAT_Y410 && cfg->formatTexture != DXGI_FORMAT_420_OPAQUE; } + +void DXGI_GetBlackColor( const d3d_format_t *pixelFormat, + union DXGI_Color black[DXGI_MAX_RENDER_TARGET], + size_t colors[DXGI_MAX_RENDER_TARGET] ) +{ + static const union DXGI_Color blackY = { .y = 0.0f }; + static const union DXGI_Color blackUV = { .u = 0.5f, .v = 0.5f }; + static const union DXGI_Color blackRGBA = { .r = 0.0f, .g = 0.0f, .b = 0.0f, .a = 1.0f }; + static const union DXGI_Color blackYUY2 = { .r = 0.0f, .g = 0.5f, .b = 0.0f, .a = 0.5f }; + static const union DXGI_Color blackVUYA = { .r = 0.5f, .g = 0.5f, .b = 0.0f, .a = 1.0f }; + static const union DXGI_Color blackY210 = { .r = 0.0f, .g = 0.5f, .b = 0.5f, .a = 0.0f }; + + static_assert(DXGI_MAX_RENDER_TARGET >= 2, "we need at least 2 RenderTargetView for NV12/P010"); + + switch (pixelFormat->formatTexture) + { + case DXGI_FORMAT_NV12: + case DXGI_FORMAT_P010: + colors[0] = 1; black[0] = blackY; + colors[1] = 2; black[1] = blackUV; + break; + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_R10G10B10A2_UNORM: + case DXGI_FORMAT_B5G6R5_UNORM: + colors[0] = 4; black[0] = blackRGBA; + colors[1] = 0; + break; + case DXGI_FORMAT_YUY2: + colors[0] = 4; black[0] = blackYUY2; + colors[1] = 0; + break; + case DXGI_FORMAT_Y410: + colors[0] = 4; black[0] = blackVUYA; + colors[1] = 0; + break; + case DXGI_FORMAT_Y210: + colors[0] = 4; black[0] = blackY210; + colors[1] = 0; + break; + case DXGI_FORMAT_AYUV: + colors[0] = 4; black[0] = blackVUYA; + colors[1] = 0; + break; + default: + vlc_assert_unreachable(); + } +} diff --git a/modules/video_chroma/dxgi_fmt.h b/modules/video_chroma/dxgi_fmt.h index da9252d688..32b68ae445 100644 --- a/modules/video_chroma/dxgi_fmt.h +++ b/modules/video_chroma/dxgi_fmt.h @@ -66,4 +66,21 @@ bool DxgiIsRGBFormat(const d3d_format_t *); #define DXGI_CHROMA_CPU 1 #define DXGI_CHROMA_GPU 2 +union DXGI_Color +{ + struct { + FLOAT r, g, b, a; + }; + struct { + FLOAT y; + }; + struct { + FLOAT u, v; + }; + FLOAT array[4]; +}; +void DXGI_GetBlackColor( const d3d_format_t *, + union DXGI_Color black[DXGI_MAX_RENDER_TARGET], + size_t colors[DXGI_MAX_RENDER_TARGET] ); + #endif /* include-guard */ diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c index 4ce1b45687..39eef96ef4 100644 --- a/modules/video_output/win32/d3d11_shaders.c +++ b/modules/video_output/win32/d3d11_shaders.c @@ -134,43 +134,17 @@ HRESULT D3D11_CreateRenderTargets( d3d11_device_t *d3d_dev, ID3D11Resource *text void D3D11_ClearRenderTargets(d3d11_device_t *d3d_dev, const d3d_format_t *cfg, ID3D11RenderTargetView *targets[DXGI_MAX_RENDER_TARGET]) { - static const FLOAT blackY[1] = {0.0f}; - static const FLOAT blackUV[2] = {0.5f, 0.5f}; - static const FLOAT blackRGBA[4] = {0.0f, 0.0f, 0.0f, 1.0f}; - static const FLOAT blackYUY2[4] = {0.0f, 0.5f, 0.0f, 0.5f}; - static const FLOAT blackVUYA[4] = {0.5f, 0.5f, 0.0f, 1.0f}; - static const FLOAT blackY210[4] = {0.0f, 0.5f, 0.5f, 0.0f}; + union DXGI_Color black[DXGI_MAX_RENDER_TARGET]; + size_t colorCount[DXGI_MAX_RENDER_TARGET]; + DXGI_GetBlackColor(cfg, black, colorCount); - static_assert(DXGI_MAX_RENDER_TARGET >= 2, "we need at least 2 RenderTargetView for NV12/P010"); - - switch (cfg->formatTexture) + if (colorCount[0]) + { + ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], black[0].array); + } + if (colorCount[1]) { - case DXGI_FORMAT_NV12: - case DXGI_FORMAT_P010: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackY); - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[1], blackUV); - break; - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_B5G6R5_UNORM: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackRGBA); - break; - case DXGI_FORMAT_YUY2: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackYUY2); - break; - case DXGI_FORMAT_Y410: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackVUYA); - break; - case DXGI_FORMAT_Y210: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackY210); - break; - case DXGI_FORMAT_AYUV: - ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[0], blackVUYA); - break; - default: - vlc_assert_unreachable(); + ID3D11DeviceContext_ClearRenderTargetView( d3d_dev->d3dcontext, targets[1], black[1].array); } } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
