d3d12: Update shader to be Shader Model 5.0 compatible

And use fxc HLSL compiler

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6434>
This commit is contained in:
Seungha Yang 2024-03-23 19:47:34 +09:00
parent 0faff6fb5e
commit 43da9b4249
7 changed files with 42 additions and 72 deletions

View File

@ -478,17 +478,17 @@ ConverterRootSignature::ConverterRootSignature (D3D_ROOT_SIGNATURE_VERSION
/* VS root const, maybe updated */ /* VS root const, maybe updated */
vs_root_const_ = (UINT) param_list_v1_1.size (); vs_root_const_ = (UINT) param_list_v1_1.size ();
param.InitAsConstants (16, 0, 1, D3D12_SHADER_VISIBILITY_VERTEX); param.InitAsConstants (16, 0, 0, D3D12_SHADER_VISIBILITY_VERTEX);
param_list_v1_1.push_back (param); param_list_v1_1.push_back (param);
/* PS alpha constant value, maybe updated */ /* PS alpha constant value, maybe updated */
ps_root_const_ = (UINT) param_list_v1_1.size (); ps_root_const_ = (UINT) param_list_v1_1.size ();
param.InitAsConstants (1, 0, 0, D3D12_SHADER_VISIBILITY_PIXEL); param.InitAsConstants (1, 1, 0, D3D12_SHADER_VISIBILITY_PIXEL);
param_list_v1_1.push_back (param); param_list_v1_1.push_back (param);
/* PS CBV, this is static */ /* PS CBV, this is static */
ps_cbv_ = (UINT) param_list_v1_1.size (); ps_cbv_ = (UINT) param_list_v1_1.size ();
param.InitAsConstantBufferView (1, 0, param.InitAsConstantBufferView (2, 0,
D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE, D3D12_ROOT_DESCRIPTOR_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE,
D3D12_SHADER_VISIBILITY_PIXEL); D3D12_SHADER_VISIBILITY_PIXEL);
param_list_v1_1.push_back (param); param_list_v1_1.push_back (param);
@ -522,12 +522,12 @@ ConverterRootSignature::ConverterRootSignature (D3D_ROOT_SIGNATURE_VERSION
/* PS alpha constant value, maybe updated */ /* PS alpha constant value, maybe updated */
ps_root_const_ = (UINT) param_list_v1_0.size (); ps_root_const_ = (UINT) param_list_v1_0.size ();
param.InitAsConstants (1, 0, 0, D3D12_SHADER_VISIBILITY_PIXEL); param.InitAsConstants (1, 1, 0, D3D12_SHADER_VISIBILITY_PIXEL);
param_list_v1_0.push_back (param); param_list_v1_0.push_back (param);
/* PS CBV, this is static */ /* PS CBV, this is static */
ps_cbv_ = (UINT) param_list_v1_0.size (); ps_cbv_ = (UINT) param_list_v1_0.size ();
param.InitAsConstantBufferView (1, 0, D3D12_SHADER_VISIBILITY_PIXEL); param.InitAsConstantBufferView (2, 0, D3D12_SHADER_VISIBILITY_PIXEL);
param_list_v1_0.push_back (param); param_list_v1_0.push_back (param);
CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC::Init_1_0 (desc, CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC::Init_1_0 (desc,

View File

@ -17,7 +17,7 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
cbuffer PsAlphaFactor : register(b0, space0) cbuffer PsAlphaFactor : register(b1)
{ {
float alphaFactor; float alphaFactor;
}; };
@ -33,39 +33,22 @@ struct PSColorSpace
float padding; float padding;
}; };
cbuffer PsConstBuffer : register(b1, space0) cbuffer PsConstBuffer : register(b2)
{ {
PSColorSpace preCoeff; PSColorSpace preCoeff;
PSColorSpace postCoeff; PSColorSpace postCoeff;
PSColorSpace primariesCoeff; PSColorSpace primariesCoeff;
}; };
#ifdef NUM_SRV_1 Texture2D shaderTexture_0 : register(t0);
Texture2D shaderTexture_0 : register(t0, space0); Texture2D shaderTexture_1 : register(t1);
#endif Texture2D shaderTexture_2 : register(t2);
#ifdef NUM_SRV_2 Texture2D shaderTexture_3 : register(t3);
Texture2D shaderTexture_0 : register(t0, space0); Texture1D<float> gammaDecLUT : register(t4);
Texture2D shaderTexture_1 : register(t1, space0); Texture1D<float> gammaEncLUT : register(t5);
#endif
#ifdef NUM_SRV_3
Texture2D shaderTexture_0 : register(t0, space0);
Texture2D shaderTexture_1 : register(t1, space0);
Texture2D shaderTexture_2 : register(t2, space0);
#endif
#ifdef NUM_SRV_4
Texture2D shaderTexture_0 : register(t0, space0);
Texture2D shaderTexture_1 : register(t1, space0);
Texture2D shaderTexture_2 : register(t2, space0);
Texture2D shaderTexture_3 : register(t3, space0);
#endif
SamplerState samplerState : register(s0, space0); SamplerState samplerState : register(s0);
SamplerState lutSamplerState : register(s1);
#ifdef BUILD_LUT
Texture1D<float> gammaDecLUT : register(t4, space0);
Texture1D<float> gammaEncLUT : register(t5, space0);
SamplerState lutSamplerState : register(s1, space0);
#endif
struct PS_INPUT struct PS_INPUT
{ {
@ -133,7 +116,6 @@ interface ISampler
float4 Execute (float2 uv); float4 Execute (float2 uv);
}; };
#ifdef NUM_SRV_1
class SamplerRGBA : ISampler class SamplerRGBA : ISampler
{ {
float4 Execute (float2 uv) float4 Execute (float2 uv)
@ -258,9 +240,7 @@ class SamplerGRAY : ISampler
return sample; return sample;
} }
}; };
#endif
#ifdef NUM_SRV_2
class SamplerNV12 : ISampler class SamplerNV12 : ISampler
{ {
float4 Execute (float2 uv) float4 Execute (float2 uv)
@ -284,9 +264,7 @@ class SamplerNV21 : ISampler
return sample; return sample;
} }
}; };
#endif
#ifdef NUM_SRV_3
class SamplerI420 : ISampler class SamplerI420 : ISampler
{ {
float4 Execute (float2 uv) float4 Execute (float2 uv)
@ -399,9 +377,7 @@ class SamplerBGRP : ISampler
return sample; return sample;
} }
}; };
#endif
#ifdef NUM_SRV_4
class SamplerGBRA : ISampler class SamplerGBRA : ISampler
{ {
float4 Execute (float2 uv) float4 Execute (float2 uv)
@ -440,7 +416,6 @@ class SamplerGBRA_12 : ISampler
return saturate (sample * 16.0); return saturate (sample * 16.0);
} }
}; };
#endif
interface IConverter interface IConverter
{ {
@ -481,7 +456,6 @@ class ConverterSimple : IConverter
} }
}; };
#ifdef BUILD_LUT
class ConverterGamma : IConverter class ConverterGamma : IConverter
{ {
float4 Execute (float4 sample) float4 Execute (float4 sample)
@ -540,7 +514,6 @@ class ConverterPrimary : IConverter
return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a); return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a);
} }
}; };
#endif
float UnormTo10bit (float sample) float UnormTo10bit (float sample)
{ {

View File

@ -17,8 +17,8 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
Texture2D shaderTexture : register(t0, space0); Texture2D shaderTexture : register(t0);
SamplerState samplerState : register(s0, space0); SamplerState samplerState : register(s0);
struct PS_INPUT struct PS_INPUT
{ {

View File

@ -17,8 +17,8 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
Texture2D shaderTexture : register(t0, space0); Texture2D shaderTexture : register(t0);
SamplerState samplerState : register(s0, space0); SamplerState samplerState : register(s0);
struct PS_INPUT struct PS_INPUT
{ {

View File

@ -17,7 +17,7 @@
* Boston, MA 02110-1301, USA. * Boston, MA 02110-1301, USA.
*/ */
cbuffer VsConstBuffer : register(b0, space1) cbuffer VsConstBuffer : register(b0)
{ {
matrix Transform; matrix Transform;
}; };

View File

@ -90,16 +90,15 @@ foreach input_format : hlsl_conv_ps_input_formats
compiled_shader = custom_target(header, compiled_shader = custom_target(header,
input : hlsl_conv_ps_source, input : hlsl_conv_ps_source,
output : header, output : header,
command : [dxc, '/Fh', '@OUTPUT@', command : [fxc, '/Fh', '@OUTPUT@',
'/E', entry_point, '/E', entry_point,
'/T', 'ps_6_0', '/T', 'ps_5_0',
'/D', 'OUTPUT_TYPE=@0@'.format(output_type), '/D', 'OUTPUT_TYPE=@0@'.format(output_type),
'/D', 'ENTRY_POINT=@0@'.format(entry_point), '/D', 'ENTRY_POINT=@0@'.format(entry_point),
'/D', 'SAMPLER=Sampler@0@'.format(in_format), '/D', 'SAMPLER=Sampler@0@'.format(in_format),
'/D', 'CONVERTER=Converter@0@'.format(conv), '/D', 'CONVERTER=Converter@0@'.format(conv),
'/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder), '/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder),
'/D', 'NUM_SRV_@0@=1'.format(num_srv), '/nologo',
'/all-resources-bound',
'@INPUT@']) '@INPUT@'])
hlsl_precompiled += [compiled_shader] hlsl_precompiled += [compiled_shader]
endforeach endforeach
@ -110,17 +109,15 @@ foreach input_format : hlsl_conv_ps_input_formats
compiled_shader = custom_target(header, compiled_shader = custom_target(header,
input : hlsl_conv_ps_source, input : hlsl_conv_ps_source,
output : header, output : header,
command : [dxc, '/Fh', '@OUTPUT@', command : [fxc, '/Fh', '@OUTPUT@',
'/E', entry_point, '/E', entry_point,
'/T', 'ps_6_0', '/T', 'ps_5_0',
'/D', 'OUTPUT_TYPE=@0@'.format(output_type), '/D', 'OUTPUT_TYPE=@0@'.format(output_type),
'/D', 'ENTRY_POINT=@0@'.format(entry_point), '/D', 'ENTRY_POINT=@0@'.format(entry_point),
'/D', 'SAMPLER=Sampler@0@'.format(in_format), '/D', 'SAMPLER=Sampler@0@'.format(in_format),
'/D', 'CONVERTER=Converter@0@'.format(conv), '/D', 'CONVERTER=Converter@0@'.format(conv),
'/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder), '/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder),
'/D', 'NUM_SRV_@0@=1'.format(num_srv), '/nologo',
'/D', 'BUILD_LUT=1',
'/all-resources-bound',
'@INPUT@']) '@INPUT@'])
hlsl_precompiled += [compiled_shader] hlsl_precompiled += [compiled_shader]
endforeach endforeach
@ -140,18 +137,18 @@ generated_collection = custom_target(header_collection,
hlsl_precompiled += generated_collection hlsl_precompiled += generated_collection
hlsl_sources = [ hlsl_sources = [
['VSMain_converter', 'vs_6_0'], ['VSMain_converter', 'vs_5_0'],
['PSMain_sample', 'ps_6_0'], ['PSMain_sample', 'ps_5_0'],
['PSMain_sample_premul', 'ps_6_0'], ['PSMain_sample_premul', 'ps_5_0'],
['VSMain_coord', 'vs_6_0'], ['VSMain_coord', 'vs_5_0'],
['PSMain_color', 'ps_6_0'], ['PSMain_color', 'ps_5_0'],
['VSMain_color', 'vs_6_0'], ['VSMain_color', 'vs_5_0'],
['PSMain_snow', 'ps_6_0'], ['PSMain_snow', 'ps_5_0'],
['PSMain_checker', 'ps_6_0'], ['PSMain_checker', 'ps_5_0'],
['PSMain_checker_luma', 'ps_6_0'], ['PSMain_checker_luma', 'ps_5_0'],
['PSMain_checker_rgb', 'ps_6_0'], ['PSMain_checker_rgb', 'ps_5_0'],
['PSMain_checker_vuya', 'ps_6_0'], ['PSMain_checker_vuya', 'ps_5_0'],
['VSMain_pos', 'vs_6_0'], ['VSMain_pos', 'vs_5_0'],
] ]
foreach shader : hlsl_sources foreach shader : hlsl_sources
@ -161,10 +158,10 @@ foreach shader : hlsl_sources
compiled_shader = custom_target(header, compiled_shader = custom_target(header,
input : source, input : source,
output : header, output : header,
command : [dxc, '/Fh', '@OUTPUT@', command : [fxc, '/Fh', '@OUTPUT@',
'/E', entry_point, '/E', entry_point,
'/T', shader.get(1), '/T', shader.get(1),
'/all-resources-bound', '/nologo',
'@INPUT@']) '@INPUT@'])
hlsl_precompiled += [compiled_shader] hlsl_precompiled += [compiled_shader]
endforeach endforeach

View File

@ -75,10 +75,10 @@ dx_headers_dep = dependency('DirectX-Headers',
version: '>= 1.611', version: '>= 1.611',
allow_fallback: true, allow_fallback: true,
required: d3d12_option) required: d3d12_option)
dxc = find_program('dxc', required : d3d12_option) fxc = find_program('fxc', required : d3d12_option)
if not gstdxva_dep.found() or not d3d12_lib.found() or not dxgi_lib.found() \ if not gstdxva_dep.found() or not d3d12_lib.found() or not dxgi_lib.found() \
or not dx_headers_dep.found() or not dxc.found() or not d2d_dep.found() \ or not dx_headers_dep.found() or not fxc.found() or not d2d_dep.found() \
or not dwmapi_lib.found() or not dwmapi_lib.found()
if d3d12_option.enabled() if d3d12_option.enabled()
error('The d3d12 was enabled explicitly, but required dependencies were not found.') error('The d3d12 was enabled explicitly, but required dependencies were not found.')