vlc | branch: master | Steve Lhomme <[email protected]> | Fri Jul 13 11:45:04 2018 +0200| [d07e7dbd7dc5281d17782c49fa9f677e20ab4ead] | committer: Steve Lhomme
direct3d11: compile pixel shader directly into a d3d_quad_t > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d07e7dbd7dc5281d17782c49fa9f677e20ab4ead --- modules/video_output/win32/d3d11_quad.h | 25 ----------- modules/video_output/win32/d3d11_shaders.c | 70 ++++++++++++++---------------- modules/video_output/win32/d3d11_shaders.h | 35 ++++++++++++--- modules/video_output/win32/direct3d11.c | 8 ++-- 4 files changed, 67 insertions(+), 71 deletions(-) diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h index 72aa3a86d7..0ce1ba3625 100644 --- a/modules/video_output/win32/d3d11_quad.h +++ b/modules/video_output/win32/d3d11_quad.h @@ -32,31 +32,6 @@ #define PS_CONST_COLORSPACE 1 #define PS_CONST_COUNT 2 -/* A Quad is texture that can be displayed in a rectangle */ -typedef struct -{ - picture_sys_t picSys; - const d3d_format_t *formatInfo; - UINT resourceCount; - ID3D11Buffer *pVertexBuffer; - UINT vertexCount; - UINT vertexStride; - ID3D11VertexShader *d3dvertexShader; - ID3D11Buffer *pIndexBuffer; - UINT indexCount; - ID3D11Buffer *pVertexShaderConstants; - ID3D11Buffer *pPixelShaderConstants[PS_CONST_COUNT]; - ID3D11PixelShader *d3dpixelShader[D3D11_MAX_SHADER_VIEW]; - ID3D11SamplerState *d3dsampState[2]; - ID3D11InputLayout *pVertexLayout; - D3D11_VIEWPORT cropViewport[D3D11_MAX_SHADER_VIEW]; - unsigned int i_width; - unsigned int i_height; - video_projection_mode_t projection; - - PS_CONSTANT_BUFFER shaderConstants; -} d3d_quad_t; - /* matches the D3D11_INPUT_ELEMENT_DESC we setup */ typedef struct d3d_vertex_t { struct { diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c index e3bbb0d232..0fa67013ce 100644 --- a/modules/video_output/win32/d3d11_shaders.c +++ b/modules/video_output/win32/d3d11_shaders.c @@ -243,10 +243,9 @@ static HRESULT CompileTargetShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool l #undef D3D11_CompilePixelShader HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool legacy_shader, d3d11_device_t *d3d_dev, - const d3d_format_t *format, const display_info_t *display, + const display_info_t *display, video_transfer_func_t transfer, bool src_full_range, - ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW], - ID3D11SamplerState *d3dsampState[2]) + d3d_quad_t *quad) { static const char *DEFAULT_NOOP = "return rgb"; const char *psz_sampler[2] = {NULL, NULL}; @@ -257,39 +256,36 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg const char *psz_move_planes[2] = {DEFAULT_NOOP, DEFAULT_NOOP}; char *psz_range = NULL; - if (d3dsampState) - { - D3D11_SAMPLER_DESC sampDesc; - memset(&sampDesc, 0, sizeof(sampDesc)); - sampDesc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; - sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - sampDesc.MinLOD = 0; - sampDesc.MaxLOD = D3D11_FLOAT32_MAX; - - HRESULT hr; - hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &d3dsampState[0]); - if (FAILED(hr)) { - msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr); - return hr; - } + D3D11_SAMPLER_DESC sampDesc; + memset(&sampDesc, 0, sizeof(sampDesc)); + sampDesc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; + sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + sampDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + sampDesc.MinLOD = 0; + sampDesc.MaxLOD = D3D11_FLOAT32_MAX; + + HRESULT hr; + hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &quad->d3dsampState[0]); + if (FAILED(hr)) { + msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr); + return hr; + } - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &d3dsampState[1]); - if (FAILED(hr)) { - msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr); - ID3D11SamplerState_Release(d3dsampState[0]); - return hr; - } + sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &quad->d3dsampState[1]); + if (FAILED(hr)) { + msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr); + ID3D11SamplerState_Release(quad->d3dsampState[0]); + return hr; } if ( display->pixelFormat->formatTexture == DXGI_FORMAT_NV12 || display->pixelFormat->formatTexture == DXGI_FORMAT_P010 ) { /* we need 2 shaders, one for the Y target, one for the UV target */ - switch (format->formatTexture) + switch (quad->formatInfo->formatTexture) { case DXGI_FORMAT_NV12: case DXGI_FORMAT_P010: @@ -322,7 +318,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg "return rgb"; break; case DXGI_FORMAT_UNKNOWN: - switch (format->fourcc) + switch (quad->formatInfo->fourcc) { case VLC_CODEC_YUVA: /* Y */ @@ -348,7 +344,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg } else { - switch (format->formatTexture) + switch (quad->formatInfo->formatTexture) { case DXGI_FORMAT_NV12: case DXGI_FORMAT_P010: @@ -380,7 +376,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg "sample = shaderTexture[0].Sample(samplerState, coords);"; break; case DXGI_FORMAT_UNKNOWN: - switch (format->fourcc) + switch (quad->formatInfo->fourcc) { case VLC_CODEC_I420_10L: psz_sampler[0] = @@ -506,7 +502,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg if (src_full_range) range_adjust = -1; /* lower the source to studio range */ } - if (!IsRGBShader(format) && !src_full_range) + if (!IsRGBShader(quad->formatInfo) && !src_full_range) range_adjust--; /* the YUV->RGB conversion already output full range */ if (range_adjust != 0) @@ -517,7 +513,7 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg FLOAT itu_black_level; FLOAT itu_range_factor; FLOAT itu_white_level; - switch (format->bitsPerChannel) + switch (quad->formatInfo->bitsPerChannel) { case 8: /* Rec. ITU-R BT.709-6 ยง4.6 */ @@ -573,15 +569,15 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg } } - HRESULT hr = CompileTargetShader(o, hd3d, legacy_shader, d3d_dev, + hr = CompileTargetShader(o, hd3d, legacy_shader, d3d_dev, psz_sampler[0], psz_src_transform, psz_display_transform, psz_tone_mapping, - psz_adjust_range, psz_move_planes[0], &output[0]); + psz_adjust_range, psz_move_planes[0], &quad->d3dpixelShader[0]); if (!FAILED(hr) && psz_sampler[1]) hr = CompileTargetShader(o, hd3d, legacy_shader, d3d_dev, psz_sampler[1], psz_src_transform, psz_display_transform, psz_tone_mapping, - psz_adjust_range, psz_move_planes[1], &output[1]); + psz_adjust_range, psz_move_planes[1], &quad->d3dpixelShader[1]); free(psz_range); return hr; diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h index 1a857dd48d..852da4fb3a 100644 --- a/modules/video_output/win32/d3d11_shaders.h +++ b/modules/video_output/win32/d3d11_shaders.h @@ -75,6 +75,32 @@ typedef struct { const char* globVertexShaderFlat; const char* globVertexShaderProjection; +/* A Quad is texture that can be displayed in a rectangle */ +typedef struct +{ + picture_sys_t picSys; + const d3d_format_t *formatInfo; + UINT resourceCount; + ID3D11Buffer *pVertexBuffer; + UINT vertexCount; + UINT vertexStride; + ID3D11VertexShader *d3dvertexShader; + ID3D11Buffer *pIndexBuffer; + UINT indexCount; + ID3D11Buffer *pVertexShaderConstants; + ID3D11Buffer *pPixelShaderConstants[2]; + UINT PSConstantsCount; + ID3D11PixelShader *d3dpixelShader[D3D11_MAX_SHADER_VIEW]; + ID3D11SamplerState *d3dsampState[2]; + ID3D11InputLayout *pVertexLayout; + D3D11_VIEWPORT cropViewport[D3D11_MAX_SHADER_VIEW]; + unsigned int i_width; + unsigned int i_height; + video_projection_mode_t projection; + + PS_CONSTANT_BUFFER shaderConstants; +} d3d_quad_t; + ID3DBlob* D3D11_CompileShader(vlc_object_t *, const d3d11_handle_t *, const d3d11_device_t *, const char *psz_shader, bool pixel); #define D3D11_CompileShader(a,b,c,d,e) D3D11_CompileShader(VLC_OBJECT(a),b,c,d,e) @@ -82,12 +108,11 @@ ID3DBlob* D3D11_CompileShader(vlc_object_t *, const d3d11_handle_t *, const d3d1 bool IsRGBShader(const d3d_format_t *); HRESULT D3D11_CompilePixelShader(vlc_object_t *, d3d11_handle_t *, bool legacy_shader, - d3d11_device_t *, const d3d_format_t *, const display_info_t *, + d3d11_device_t *, const display_info_t *, video_transfer_func_t, bool src_full_range, - ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW], - ID3D11SamplerState *d3dsampState[2]); -#define D3D11_CompilePixelShader(a,b,c,d,e,f,g,h,i,j) \ - D3D11_CompilePixelShader(VLC_OBJECT(a),b,c,d,e,f,g,h,i,j) + d3d_quad_t *); +#define D3D11_CompilePixelShader(a,b,c,d,e,f,g,h) \ + D3D11_CompilePixelShader(VLC_OBJECT(a),b,c,d,e,f,g,h) float GetFormatLuminance(vlc_object_t *, const video_format_t *); #define GetFormatLuminance(a,b) GetFormatLuminance(VLC_OBJECT(a),b) diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c index 05db78427d..92a8139a6d 100644 --- a/modules/video_output/win32/direct3d11.c +++ b/modules/video_output/win32/direct3d11.c @@ -1401,8 +1401,8 @@ static int Direct3D11CreateFormatResources(vout_display_t *vd, const video_forma sys->legacy_shader = sys->d3d_dev.feature_level < D3D_FEATURE_LEVEL_10_0 || !CanUseTextureArray(vd); hr = D3D11_CompilePixelShader(vd, &sys->hd3d, sys->legacy_shader, &sys->d3d_dev, - sys->picQuad.formatInfo, &sys->display, fmt->transfer, fmt->b_color_range_full, - sys->picQuad.d3dpixelShader, sys->picQuad.d3dsampState); + &sys->display, fmt->transfer, fmt->b_color_range_full, + &sys->picQuad); if (FAILED(hr)) { msg_Err(vd, "Failed to create the pixel shader. (hr=0x%lX)", hr); @@ -1508,8 +1508,8 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd) if (sys->regionQuad.formatInfo != NULL) { hr = D3D11_CompilePixelShader(vd, &sys->hd3d, sys->legacy_shader, &sys->d3d_dev, - sys->regionQuad.formatInfo, &sys->display, TRANSFER_FUNC_SRGB, true, - sys->regionQuad.d3dpixelShader, NULL); + &sys->display, TRANSFER_FUNC_SRGB, true, + &sys->regionQuad); if (FAILED(hr)) { for (size_t i=0; i<D3D11_MAX_SHADER_VIEW; i++) _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
