@@ -1222,7 +1222,7 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
1222
1222
if ((p_format.usage_bits & TEXTURE_USAGE_STORAGE_BIT)) {
1223
1223
resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
1224
1224
}
1225
- if ((p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT)) {
1225
+ if ((p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) && (p_format. usage_bits & TEXTURE_USAGE_VRS_FRAGMENT_SHADING_RATE_BIT) ) {
1226
1226
// For VRS images we can't use the typeless format.
1227
1227
resource_desc.Format = DXGI_FORMAT_R8_UINT;
1228
1228
}
@@ -1827,8 +1827,11 @@ static D3D12_BARRIER_ACCESS _rd_texture_layout_access_mask(RDD::TextureLayout p_
1827
1827
return D3D12_BARRIER_ACCESS_RESOLVE_SOURCE;
1828
1828
case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
1829
1829
return D3D12_BARRIER_ACCESS_RESOLVE_DEST;
1830
- case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL :
1830
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL :
1831
1831
return D3D12_BARRIER_ACCESS_SHADING_RATE_SOURCE;
1832
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL:
1833
+ DEV_ASSERT (false && " Fragment density maps are not supported in D3D12." );
1834
+ return D3D12_BARRIER_ACCESS_NO_ACCESS;
1832
1835
default :
1833
1836
return D3D12_BARRIER_ACCESS_NO_ACCESS;
1834
1837
}
@@ -1947,7 +1950,7 @@ static void _rd_stages_to_d3d12(BitField<RDD::PipelineStageBits> p_stages, D3D12
1947
1950
r_sync |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
1948
1951
}
1949
1952
1950
- if (p_stages.has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADER_BIT)) {
1953
+ if (p_stages.has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADER_BIT) || p_stages. has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT) ) {
1951
1954
r_sync |= D3D12_BARRIER_SYNC_PIXEL_SHADING;
1952
1955
}
1953
1956
@@ -2042,8 +2045,11 @@ static D3D12_BARRIER_LAYOUT _rd_texture_layout_to_d3d12_barrier_layout(RDD::Text
2042
2045
return D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE;
2043
2046
case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
2044
2047
return D3D12_BARRIER_LAYOUT_RESOLVE_DEST;
2045
- case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL :
2048
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL :
2046
2049
return D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE;
2050
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL:
2051
+ DEV_ASSERT (false && " Fragment density maps are not supported in D3D12." );
2052
+ return D3D12_BARRIER_LAYOUT_UNDEFINED;
2047
2053
default :
2048
2054
DEV_ASSERT (false && " Unknown texture layout." );
2049
2055
return D3D12_BARRIER_LAYOUT_UNDEFINED;
@@ -2451,7 +2457,7 @@ RDD::SwapChainID RenderingDeviceDriverD3D12::swap_chain_create(RenderingContextD
2451
2457
color_ref.aspect .set_flag (RDD::TEXTURE_ASPECT_COLOR_BIT);
2452
2458
subpass.color_references .push_back (color_ref);
2453
2459
2454
- RenderPassID render_pass = render_pass_create (attachment, subpass, {}, 1 );
2460
+ RenderPassID render_pass = render_pass_create (attachment, subpass, {}, 1 , AttachmentReference () );
2455
2461
ERR_FAIL_COND_V (!render_pass, SwapChainID ());
2456
2462
2457
2463
// Create the empty swap chain until it is resized.
@@ -2811,8 +2817,8 @@ RDD::FramebufferID RenderingDeviceDriverD3D12::_framebuffer_create(RenderPassID
2811
2817
2812
2818
uint32_t vrs_index = UINT32_MAX;
2813
2819
for (const Subpass &E : pass_info->subpasses ) {
2814
- if (E.vrs_reference .attachment != AttachmentReference::UNUSED) {
2815
- vrs_index = E.vrs_reference .attachment ;
2820
+ if (E.fragment_shading_rate_reference .attachment != AttachmentReference::UNUSED) {
2821
+ vrs_index = E.fragment_shading_rate_reference .attachment ;
2816
2822
}
2817
2823
}
2818
2824
@@ -4963,7 +4969,9 @@ Vector<uint8_t> RenderingDeviceDriverD3D12::pipeline_cache_serialize() {
4963
4969
4964
4970
// ----- SUBPASS -----
4965
4971
4966
- RDD::RenderPassID RenderingDeviceDriverD3D12::render_pass_create (VectorView<Attachment> p_attachments, VectorView<Subpass> p_subpasses, VectorView<SubpassDependency> p_subpass_dependencies, uint32_t p_view_count) {
4972
+ RDD::RenderPassID RenderingDeviceDriverD3D12::render_pass_create (VectorView<Attachment> p_attachments, VectorView<Subpass> p_subpasses, VectorView<SubpassDependency> p_subpass_dependencies, uint32_t p_view_count, AttachmentReference p_fragment_density_map_attachment) {
4973
+ ERR_FAIL_COND_V_MSG (p_fragment_density_map_attachment.attachment != AttachmentReference::UNUSED, RenderPassID (), " Fragment density maps are not supported in D3D12." );
4974
+
4967
4975
// Pre-bookkeep.
4968
4976
RenderPassInfo *pass_info = VersatileResource::allocate<RenderPassInfo>(resources_allocator);
4969
4977
@@ -5064,7 +5072,7 @@ void RenderingDeviceDriverD3D12::command_begin_render_pass(CommandBufferID p_cmd
5064
5072
}
5065
5073
}
5066
5074
5067
- if (fb_info->vrs_attachment && vrs_capabilities. ss_image_supported ) {
5075
+ if (fb_info->vrs_attachment && fsr_capabilities. attachment_supported ) {
5068
5076
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
5069
5077
cmd_buf_info->cmd_list ->QueryInterface (cmd_list_5.GetAddressOf ());
5070
5078
if (cmd_list_5) {
@@ -5184,7 +5192,7 @@ void RenderingDeviceDriverD3D12::command_end_render_pass(CommandBufferID p_cmd_b
5184
5192
const FramebufferInfo *fb_info = cmd_buf_info->render_pass_state .fb_info ;
5185
5193
const RenderPassInfo *pass_info = cmd_buf_info->render_pass_state .pass_info ;
5186
5194
5187
- if (vrs_capabilities. ss_image_supported ) {
5195
+ if (fsr_capabilities. attachment_supported ) {
5188
5196
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
5189
5197
cmd_buf_info->cmd_list ->QueryInterface (cmd_list_5.GetAddressOf ());
5190
5198
if (cmd_list_5) {
@@ -6244,12 +6252,6 @@ uint64_t RenderingDeviceDriverD3D12::limit_get(Limit p_limit) {
6244
6252
return subgroup_capabilities.supported_stages_flags_rd ();
6245
6253
case LIMIT_SUBGROUP_OPERATIONS:
6246
6254
return subgroup_capabilities.supported_operations_flags_rd ();
6247
- case LIMIT_VRS_TEXEL_WIDTH:
6248
- case LIMIT_VRS_TEXEL_HEIGHT:
6249
- return vrs_capabilities.ss_image_tile_size ;
6250
- case LIMIT_VRS_MAX_FRAGMENT_WIDTH:
6251
- case LIMIT_VRS_MAX_FRAGMENT_HEIGHT:
6252
- return vrs_capabilities.ss_max_fragment_size ;
6253
6255
case LIMIT_MAX_SHADER_VARYINGS:
6254
6256
return MIN (D3D12_VS_OUTPUT_REGISTER_COUNT, D3D12_PS_INPUT_REGISTER_COUNT);
6255
6257
default : {
@@ -6286,12 +6288,8 @@ uint64_t RenderingDeviceDriverD3D12::api_trait_get(ApiTrait p_trait) {
6286
6288
6287
6289
bool RenderingDeviceDriverD3D12::has_feature (Features p_feature) {
6288
6290
switch (p_feature) {
6289
- case SUPPORTS_MULTIVIEW:
6290
- return multiview_capabilities.is_supported && multiview_capabilities.max_view_count > 1 ;
6291
6291
case SUPPORTS_FSR_HALF_FLOAT:
6292
6292
return shader_capabilities.native_16bit_ops && storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported ;
6293
- case SUPPORTS_ATTACHMENT_VRS:
6294
- return vrs_capabilities.ss_image_supported ;
6295
6293
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
6296
6294
return true ;
6297
6295
case SUPPORTS_BUFFER_DEVICE_ADDRESS:
@@ -6305,6 +6303,14 @@ const RDD::MultiviewCapabilities &RenderingDeviceDriverD3D12::get_multiview_capa
6305
6303
return multiview_capabilities;
6306
6304
}
6307
6305
6306
+ const RDD::FragmentShadingRateCapabilities &RenderingDeviceDriverD3D12::get_fragment_shading_rate_capabilities () {
6307
+ return fsr_capabilities;
6308
+ }
6309
+
6310
+ const RDD::FragmentDensityMapCapabilities &RenderingDeviceDriverD3D12::get_fragment_density_map_capabilities () {
6311
+ return fdm_capabilities;
6312
+ }
6313
+
6308
6314
String RenderingDeviceDriverD3D12::get_api_name () const {
6309
6315
return " D3D12" ;
6310
6316
}
@@ -6466,12 +6472,6 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6466
6472
device_capabilities.version_minor = feature_level % 10 ;
6467
6473
6468
6474
// Assume not supported until proven otherwise.
6469
- vrs_capabilities.draw_call_supported = false ;
6470
- vrs_capabilities.primitive_supported = false ;
6471
- vrs_capabilities.primitive_in_multiviewport = false ;
6472
- vrs_capabilities.ss_image_supported = false ;
6473
- vrs_capabilities.ss_image_tile_size = 1 ;
6474
- vrs_capabilities.additional_rates_supported = false ;
6475
6475
multiview_capabilities.is_supported = false ;
6476
6476
multiview_capabilities.geometry_shader_is_supported = false ;
6477
6477
multiview_capabilities.tessellation_shader_is_supported = false ;
@@ -6562,14 +6562,12 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6562
6562
res = device->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS6, &options6, sizeof (options6));
6563
6563
if (SUCCEEDED (res)) {
6564
6564
if (options6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_1) {
6565
- vrs_capabilities. draw_call_supported = true ;
6565
+ fsr_capabilities. pipeline_supported = true ;
6566
6566
if (options6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_2) {
6567
- vrs_capabilities.primitive_supported = true ;
6568
- vrs_capabilities.primitive_in_multiviewport = options6.PerPrimitiveShadingRateSupportedWithViewportIndexing ;
6569
- vrs_capabilities.ss_image_supported = true ;
6570
- vrs_capabilities.ss_image_tile_size = options6.ShadingRateImageTileSize ;
6571
- vrs_capabilities.ss_max_fragment_size = 8 ; // TODO figure out if this is supplied and/or needed
6572
- vrs_capabilities.additional_rates_supported = options6.AdditionalShadingRatesSupported ;
6567
+ fsr_capabilities.primitive_supported = true ;
6568
+ fsr_capabilities.attachment_supported = true ;
6569
+ fsr_capabilities.min_texel_size = Size2i (options6.ShadingRateImageTileSize , options6.ShadingRateImageTileSize );
6570
+ fsr_capabilities.max_texel_size = Size2i (8 , 8 );
6573
6571
}
6574
6572
}
6575
6573
}
@@ -6581,19 +6579,16 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6581
6579
barrier_capabilities.enhanced_barriers_supported = options12.EnhancedBarriersSupported ;
6582
6580
}
6583
6581
6584
- if (vrs_capabilities. draw_call_supported || vrs_capabilities .primitive_supported || vrs_capabilities. ss_image_supported ) {
6582
+ if (fsr_capabilities. pipeline_supported || fsr_capabilities .primitive_supported || fsr_capabilities. attachment_supported ) {
6585
6583
print_verbose (" - D3D12 Variable Rate Shading supported:" );
6586
- if (vrs_capabilities. draw_call_supported ) {
6584
+ if (fsr_capabilities. pipeline_supported ) {
6587
6585
print_verbose (" Draw call" );
6588
6586
}
6589
- if (vrs_capabilities.primitive_supported ) {
6590
- print_verbose (String (" Per-primitive (multi-viewport: " ) + (vrs_capabilities.primitive_in_multiviewport ? " yes" : " no" ) + " )" );
6591
- }
6592
- if (vrs_capabilities.ss_image_supported ) {
6593
- print_verbose (String (" Screen-space image (tile size: " ) + itos (vrs_capabilities.ss_image_tile_size ) + " )" );
6587
+ if (fsr_capabilities.primitive_supported ) {
6588
+ print_verbose (" Primitive" );
6594
6589
}
6595
- if (vrs_capabilities. additional_rates_supported ) {
6596
- print_verbose (String (" Additional rates : " ) + (vrs_capabilities. additional_rates_supported ? " yes " : " no " ) );
6590
+ if (fsr_capabilities. attachment_supported ) {
6591
+ print_verbose (String (" Screen-space image (tile size : " ) + itos (fsr_capabilities. min_texel_size . x ) + " ) " );
6597
6592
}
6598
6593
} else {
6599
6594
print_verbose (" - D3D12 Variable Rate Shading not supported" );
0 commit comments