[vlc-commits] direct3d11: set the swapchain colorspace once the buffers are set
Steve Lhomme
git at videolan.org
Thu May 9 15:31:09 CEST 2019
vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Thu May 9 11:19:25 2019 +0200| [4f6c8502783111112684a8ac67ff47d64e20e962] | committer: Steve Lhomme
direct3d11: set the swapchain colorspace once the buffers are set
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4f6c8502783111112684a8ac67ff47d64e20e962
---
modules/video_output/win32/direct3d11.c | 57 ++++++++++++++++-----------------
1 file changed, 27 insertions(+), 30 deletions(-)
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index a9caf168d6..1fdd1be66e 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -169,6 +169,8 @@ static void UpdatePicQuadPosition(vout_display_t *);
static int Control(vout_display_t *, int, va_list);
+static void SelectSwapchainColorspace(vout_display_t *vd, const struct direct3d_cfg_t *cfg);
+
static HRESULT UpdateBackBuffer(vout_display_t *vd, const video_format_t *fmt)
{
vout_display_sys_t *sys = vd->sys;
@@ -337,7 +339,6 @@ static int SetupWindowedOutput(vout_display_t *vd, UINT width, UINT height)
return VLC_EGENERIC;
}
- IDXGISwapChain_QueryInterface( sys->internal_swapchain.dxgiswapChain, &IID_IDXGISwapChain4, (void **)&sys->internal_swapchain.dxgiswapChain4);
return VLC_SUCCESS;
}
#endif /* !VLC_WINSTORE_APP */
@@ -400,6 +401,8 @@ static bool UpdateSwapchain( void *opaque, const struct direct3d_cfg_t *cfg )
D3D11_ClearRenderTargets( &sys->internal_swapchain.d3d_dev, sys->display.pixelFormat, sys->internal_swapchain.swapchainTargetView );
+ SelectSwapchainColorspace(vd, cfg);
+
return true;
}
@@ -1092,46 +1095,40 @@ static bool canHandleConversion(const dxgi_color_space *src, const dxgi_color_sp
}
#endif
-static void D3D11SetColorSpace(vout_display_t *vd)
+static void SelectSwapchainColorspace(vout_display_t *vd, const struct direct3d_cfg_t *cfg)
{
vout_display_sys_t *sys = vd->sys;
+ struct d3d11_local_swapchain *display = &sys->internal_swapchain;
HRESULT hr;
int best = -1;
int score, best_score = 0;
UINT support;
IDXGISwapChain3 *dxgiswapChain3 = NULL;
sys->display.colorspace = &color_spaces[0];
- if (sys->sys.event == NULL) /* TODO support external colourspace handling */
- goto done;
- hr = IDXGISwapChain_QueryInterface( sys->internal_swapchain.dxgiswapChain, &IID_IDXGISwapChain3, (void **)&dxgiswapChain3);
+ hr = IDXGISwapChain_QueryInterface( display->dxgiswapChain, &IID_IDXGISwapChain3, (void **)&dxgiswapChain3);
if (FAILED(hr)) {
- msg_Warn(vd, "could not get a IDXGISwapChain3");
+ msg_Warn(display->obj, "could not get a IDXGISwapChain3");
goto done;
}
- bool src_full_range = vd->source.color_range == COLOR_RANGE_FULL ||
- /* the YUV->RGB conversion already output full range */
- is_d3d11_opaque(vd->source.i_chroma) ||
- vlc_fourcc_IsYUV(vd->source.i_chroma);
-
/* pick the best output based on color support and transfer */
/* TODO support YUV output later */
for (int i=0; color_spaces[i].name; ++i)
{
hr = IDXGISwapChain3_CheckColorSpaceSupport(dxgiswapChain3, color_spaces[i].dxgi, &support);
if (SUCCEEDED(hr) && support) {
- msg_Dbg(vd, "supports colorspace %s", color_spaces[i].name);
+ msg_Dbg(display->obj, "supports colorspace %s", color_spaces[i].name);
score = 0;
- if (color_spaces[i].primaries == vd->source.primaries)
+ if (color_spaces[i].primaries == cfg->primaries)
score++;
- if (color_spaces[i].color == vd->source.space)
+ if (color_spaces[i].color == cfg->colorspace)
score += 2; /* we don't want to translate color spaces */
- if (color_spaces[i].transfer == vd->source.transfer ||
+ if (color_spaces[i].transfer == cfg->transfer ||
/* favor 2084 output for HLG source */
- (color_spaces[i].transfer == TRANSFER_FUNC_SMPTE_ST2084 && vd->source.transfer == TRANSFER_FUNC_HLG))
+ (color_spaces[i].transfer == TRANSFER_FUNC_SMPTE_ST2084 && cfg->transfer == TRANSFER_FUNC_HLG))
score++;
- if (color_spaces[i].b_full_range == src_full_range)
+ if (color_spaces[i].b_full_range == cfg->full_range)
score++;
if (score > best_score || (score && best == -1)) {
best = i;
@@ -1143,13 +1140,15 @@ static void D3D11SetColorSpace(vout_display_t *vd)
if (best == -1)
{
best = 0;
- msg_Warn(vd, "no matching colorspace found force %s", color_spaces[best].name);
+ msg_Warn(display->obj, "no matching colorspace found force %s", color_spaces[best].name);
}
+ IDXGISwapChain_QueryInterface( display->dxgiswapChain, &IID_IDXGISwapChain4, (void **)&display->dxgiswapChain4);
+
#ifdef HAVE_DXGI1_6_H
IDXGIOutput *dxgiOutput = NULL;
- if (SUCCEEDED(IDXGISwapChain_GetContainingOutput( sys->internal_swapchain.dxgiswapChain, &dxgiOutput )))
+ if (SUCCEEDED(IDXGISwapChain_GetContainingOutput( display->dxgiswapChain, &dxgiOutput )))
{
IDXGIOutput6 *dxgiOutput6 = NULL;
if (SUCCEEDED(IDXGIOutput_QueryInterface( dxgiOutput, &IID_IDXGIOutput6, (void **)&dxgiOutput6 )))
@@ -1163,7 +1162,7 @@ static void D3D11SetColorSpace(vout_display_t *vd)
if (color_spaces[i].dxgi == desc1.ColorSpace)
{
if (!canHandleConversion(&color_spaces[best], &color_spaces[i]))
- msg_Warn(vd, "Can't handle conversion to screen format %s", color_spaces[i].name);
+ msg_Warn(display->obj, "Can't handle conversion to screen format %s", color_spaces[i].name);
else
{
best = i;
@@ -1173,7 +1172,7 @@ static void D3D11SetColorSpace(vout_display_t *vd)
}
}
- msg_Dbg(vd, "Output max luminance: %.1f, colorspace %s, bits per pixel %d", desc1.MaxFullFrameLuminance, csp?csp->name:"unknown", desc1.BitsPerColor);
+ msg_Dbg(display->obj, "Output max luminance: %.1f, colorspace %s, bits per pixel %d", desc1.MaxFullFrameLuminance, csp?csp->name:"unknown", desc1.BitsPerColor);
//sys->display.luminance_peak = desc1.MaxFullFrameLuminance;
}
IDXGIOutput6_Release( dxgiOutput6 );
@@ -1186,10 +1185,10 @@ static void D3D11SetColorSpace(vout_display_t *vd)
if (SUCCEEDED(hr))
{
sys->display.colorspace = &color_spaces[best];
- msg_Dbg(vd, "using colorspace %s", sys->display.colorspace->name);
+ msg_Dbg(display->obj, "using colorspace %s", sys->display.colorspace->name);
}
else
- msg_Err(vd, "Failed to set colorspace %s. (hr=0x%lX)", sys->display.colorspace->name, hr);
+ msg_Err(display->obj, "Failed to set colorspace %s. (hr=0x%lX)", sys->display.colorspace->name, hr);
done:
/* guestimate the display peak luminance */
switch (sys->display.colorspace->transfer)
@@ -1281,8 +1280,6 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmtp)
if (ret != VLC_SUCCESS)
return ret;
- D3D11SetColorSpace(vd);
-
video_format_t fmt;
video_format_Copy(&fmt, &vd->source);
int err = SetupOutputFormat(vd, &fmt);
@@ -1320,6 +1317,11 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmtp)
return VLC_EGENERIC;
}
+ if (Direct3D11CreateFormatResources(vd, &fmt)) {
+ msg_Err(vd, "Failed to allocate format resources");
+ return VLC_EGENERIC;
+ }
+
if (Direct3D11CreateGenericResources(vd)) {
msg_Err(vd, "Failed to allocate resources");
if ( sys->cleanupDeviceCb )
@@ -1423,11 +1425,6 @@ static int SetupOutputFormat(vout_display_t *vd, video_format_t *fmt)
if (!sys->regionQuad.textureFormat)
sys->regionQuad.textureFormat = GetBlendableFormat(vd, VLC_CODEC_BGRA);
- if (Direct3D11CreateFormatResources(vd, fmt)) {
- msg_Err(vd, "Failed to allocate format resources");
- return VLC_EGENERIC;
- }
-
return VLC_SUCCESS;
}
More information about the vlc-commits
mailing list