vlc | branch: master | Steve Lhomme <[email protected]> | Thu May 9 11:41:18 2019 +0200| [c4262d2649122b95ebfc3daa2c5f17a06b71cda6] | committer: Steve Lhomme
direct3d11: move the hardcoded DXGI colorimetry list to the swapchain The rendering can use any values, just a few select subsets > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c4262d2649122b95ebfc3daa2c5f17a06b71cda6 --- modules/video_output/win32/d3d11_quad.c | 4 +-- modules/video_output/win32/d3d11_shaders.c | 10 +++--- modules/video_output/win32/d3d11_shaders.h | 20 +++--------- modules/video_output/win32/direct3d11.c | 50 ++++++++++++++++++++++++------ 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c index 0e12e29060..d51781fc96 100644 --- a/modules/video_output/win32/d3d11_quad.c +++ b/modules/video_output/win32/d3d11_quad.c @@ -1040,10 +1040,10 @@ int D3D11_SetupQuad(vlc_object_t *o, d3d11_device_t *d3d_dev, const video_format memcpy(colorspace.Colorspace, ppColorspace, sizeof(colorspace.Colorspace)); - if (fmt->primaries != displayFormat->colorspace->primaries) + if (fmt->primaries != displayFormat->primaries) { GetPrimariesTransform(colorspace.Primaries, fmt->primaries, - displayFormat->colorspace->primaries); + displayFormat->primaries); } ShaderUpdateConstants(o, d3d_dev, quad, PS_CONST_COLORSPACE, &colorspace); diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c index b24f0eb450..5150189602 100644 --- a/modules/video_output/win32/d3d11_shaders.c +++ b/modules/video_output/win32/d3d11_shaders.c @@ -423,7 +423,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg video_transfer_func_t src_transfer; - if (transfer != display->colorspace->transfer) + if (transfer != display->transfer) { /* we need to go in linear mode */ switch (transfer) @@ -466,7 +466,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg break; } - switch (display->colorspace->transfer) + switch (display->transfer) { case TRANSFER_FUNC_SRGB: if (src_transfer == TRANSFER_FUNC_LINEAR) @@ -502,12 +502,12 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg msg_Warn(o, "don't know how to transfer from %d to SMPTE ST 2084", src_transfer); break; default: - msg_Warn(o, "don't know how to transfer from %d to %d", src_transfer, display->colorspace->transfer); + msg_Warn(o, "don't know how to transfer from %d to %d", src_transfer, display->transfer); break; } } - if (display->colorspace->primaries != primaries) + if (display->primaries != primaries) { switch (primaries) { @@ -526,7 +526,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg } int range_adjust = 0; - if (display->colorspace->b_full_range) { + if (display->b_full_range) { if (!src_full_range) range_adjust = 1; /* raise the source to full range */ } else { diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h index 501410a2d5..5af23b3943 100644 --- a/modules/video_output/win32/d3d11_shaders.h +++ b/modules/video_output/win32/d3d11_shaders.h @@ -30,23 +30,11 @@ #define DEFAULT_SRGB_BRIGHTNESS 100 #define MAX_PQ_BRIGHTNESS 10000 -typedef enum video_color_axis { - COLOR_AXIS_RGB, - COLOR_AXIS_YCBCR, -} video_color_axis; - -typedef struct { - DXGI_COLOR_SPACE_TYPE dxgi; - const char *name; - video_color_axis axis; - video_color_primaries_t primaries; - video_transfer_func_t transfer; - video_color_space_t color; - bool b_full_range; -} dxgi_color_space; - typedef struct { - const dxgi_color_space *colorspace; + video_color_primaries_t primaries; + video_transfer_func_t transfer; + video_color_space_t color; + bool b_full_range; unsigned luminance_peak; const d3d_format_t *pixelFormat; } display_info_t; diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c index cedbceffc6..b0c60a32a7 100644 --- a/modules/video_output/win32/direct3d11.c +++ b/modules/video_output/win32/direct3d11.c @@ -88,11 +88,28 @@ vlc_module_begin () set_callbacks(Open, Close) vlc_module_end () +typedef enum video_color_axis { + COLOR_AXIS_RGB, + COLOR_AXIS_YCBCR, +} video_color_axis; + +typedef struct { + DXGI_COLOR_SPACE_TYPE dxgi; + const char *name; + video_color_axis axis; + video_color_primaries_t primaries; + video_transfer_func_t transfer; + video_color_space_t color; + bool b_full_range; +} dxgi_color_space; + struct d3d11_local_swapchain { vlc_object_t *obj; d3d11_device_t d3d_dev; + const dxgi_color_space *colorspace; + HWND swapchainHwnd; IDXGISwapChain1 *dxgiswapChain; /* DXGI 1.2 swap chain */ IDXGISwapChain4 *dxgiswapChain4; /* DXGI 1.5 for HDR metadata */ @@ -171,6 +188,18 @@ static int Control(vout_display_t *, int, va_list); static void SelectSwapchainColorspace(vout_display_t *vd, const struct direct3d_cfg_t *cfg); +static int UpdateDisplayFormat(vout_display_t *vd, struct output_cfg_t *out) +{ + vout_display_sys_t *sys = vd->sys; + + sys->display.color = out->colorspace; + sys->display.transfer = out->transfer; + sys->display.primaries = out->primaries; + sys->display.b_full_range = out->full_range; + + return VLC_SUCCESS; +} + static int QueryDisplayFormat(vout_display_t *vd, const video_format_t *fmt) { vout_display_sys_t *sys = vd->sys; @@ -221,7 +250,7 @@ static int QueryDisplayFormat(vout_display_t *vd, const video_format_t *fmt) return VLC_EGENERIC; } - return VLC_SUCCESS; + return UpdateDisplayFormat(vd, &out); } static void UpdateSize(vout_display_t *vd) @@ -499,13 +528,14 @@ static int SetupWindowLessOutput(vout_display_t *vd) static bool LocalSwapchainUpdateOutput( void *opaque, const struct direct3d_cfg_t *cfg, struct output_cfg_t *out ) { vout_display_t *vd = opaque; + struct d3d11_local_swapchain *display = &vd->sys->internal_swapchain; if ( !UpdateSwapchain( vd, cfg ) ) return false; out->surface_format = vd->sys->display.pixelFormat->formatTexture; - out->full_range = vd->sys->display.colorspace->b_full_range; - out->colorspace = vd->sys->display.colorspace->color; - out->primaries = vd->sys->display.colorspace->primaries; - out->transfer = vd->sys->display.colorspace->transfer; + out->full_range = display->colorspace->b_full_range; + out->colorspace = display->colorspace->color; + out->primaries = display->colorspace->primaries; + out->transfer = display->colorspace->transfer; return true; } @@ -1113,7 +1143,7 @@ static void SelectSwapchainColorspace(vout_display_t *vd, const struct direct3d_ int score, best_score = 0; UINT support; IDXGISwapChain3 *dxgiswapChain3 = NULL; - sys->display.colorspace = &color_spaces[0]; + display->colorspace = &color_spaces[0]; hr = IDXGISwapChain_QueryInterface( display->dxgiswapChain, &IID_IDXGISwapChain3, (void **)&dxgiswapChain3); if (FAILED(hr)) { @@ -1193,14 +1223,14 @@ static void SelectSwapchainColorspace(vout_display_t *vd, const struct direct3d_ hr = IDXGISwapChain3_SetColorSpace1(dxgiswapChain3, color_spaces[best].dxgi); if (SUCCEEDED(hr)) { - sys->display.colorspace = &color_spaces[best]; - msg_Dbg(display->obj, "using colorspace %s", sys->display.colorspace->name); + display->colorspace = &color_spaces[best]; + msg_Dbg(display->obj, "using colorspace %s", display->colorspace->name); } else - msg_Err(display->obj, "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)", display->colorspace->name, hr); done: /* guestimate the display peak luminance */ - switch (sys->display.colorspace->transfer) + switch (display->colorspace->transfer) { case TRANSFER_FUNC_LINEAR: case TRANSFER_FUNC_SRGB: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
