@@ -1203,7 +1203,7 @@ RDD::TextureID RenderingDeviceDriverD3D12::texture_create(const TextureFormat &p
1203
1203
if ((p_format.usage_bits & TEXTURE_USAGE_STORAGE_BIT)) {
1204
1204
resource_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
1205
1205
}
1206
- if ((p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT)) {
1206
+ if ((p_format.usage_bits & TEXTURE_USAGE_VRS_ATTACHMENT_BIT) && (p_format. usage_bits & TEXTURE_USAGE_VRS_FRAGMENT_SHADING_RATE_BIT) ) {
1207
1207
// For VRS images we can't use the typeless format.
1208
1208
resource_desc.Format = DXGI_FORMAT_R8_UINT;
1209
1209
}
@@ -1808,8 +1808,11 @@ static D3D12_BARRIER_ACCESS _rd_texture_layout_access_mask(RDD::TextureLayout p_
1808
1808
return D3D12_BARRIER_ACCESS_RESOLVE_SOURCE;
1809
1809
case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
1810
1810
return D3D12_BARRIER_ACCESS_RESOLVE_DEST;
1811
- case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL :
1811
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL :
1812
1812
return D3D12_BARRIER_ACCESS_SHADING_RATE_SOURCE;
1813
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL:
1814
+ DEV_ASSERT (false && " Fragment density maps are not supported in D3D12." );
1815
+ return D3D12_BARRIER_ACCESS_NO_ACCESS;
1813
1816
default :
1814
1817
return D3D12_BARRIER_ACCESS_NO_ACCESS;
1815
1818
}
@@ -1928,7 +1931,7 @@ static void _rd_stages_to_d3d12(BitField<RDD::PipelineStageBits> p_stages, D3D12
1928
1931
r_sync |= D3D12_BARRIER_SYNC_VERTEX_SHADING;
1929
1932
}
1930
1933
1931
- if (p_stages.has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADER_BIT)) {
1934
+ if (p_stages.has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADER_BIT) || p_stages. has_flag (RDD::PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT) ) {
1932
1935
r_sync |= D3D12_BARRIER_SYNC_PIXEL_SHADING;
1933
1936
}
1934
1937
@@ -2023,8 +2026,11 @@ static D3D12_BARRIER_LAYOUT _rd_texture_layout_to_d3d12_barrier_layout(RDD::Text
2023
2026
return D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE;
2024
2027
case RDD::TEXTURE_LAYOUT_RESOLVE_DST_OPTIMAL:
2025
2028
return D3D12_BARRIER_LAYOUT_RESOLVE_DEST;
2026
- case RDD::TEXTURE_LAYOUT_VRS_ATTACHMENT_OPTIMAL :
2029
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL :
2027
2030
return D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE;
2031
+ case RDD::TEXTURE_LAYOUT_FRAGMENT_DENSITY_MAP_ATTACHMENT_OPTIMAL:
2032
+ DEV_ASSERT (false && " Fragment density maps are not supported in D3D12." );
2033
+ return D3D12_BARRIER_LAYOUT_UNDEFINED;
2028
2034
default :
2029
2035
DEV_ASSERT (false && " Unknown texture layout." );
2030
2036
return D3D12_BARRIER_LAYOUT_UNDEFINED;
@@ -2412,7 +2418,7 @@ RDD::SwapChainID RenderingDeviceDriverD3D12::swap_chain_create(RenderingContextD
2412
2418
color_ref.aspect .set_flag (RDD::TEXTURE_ASPECT_COLOR_BIT);
2413
2419
subpass.color_references .push_back (color_ref);
2414
2420
2415
- RenderPassID render_pass = render_pass_create (attachment, subpass, {}, 1 );
2421
+ RenderPassID render_pass = render_pass_create (attachment, subpass, {}, 1 , AttachmentReference () );
2416
2422
ERR_FAIL_COND_V (!render_pass, SwapChainID ());
2417
2423
2418
2424
// Create the empty swap chain until it is resized.
@@ -2772,8 +2778,8 @@ RDD::FramebufferID RenderingDeviceDriverD3D12::_framebuffer_create(RenderPassID
2772
2778
2773
2779
uint32_t vrs_index = UINT32_MAX;
2774
2780
for (const Subpass &E : pass_info->subpasses ) {
2775
- if (E.vrs_reference .attachment != AttachmentReference::UNUSED) {
2776
- vrs_index = E.vrs_reference .attachment ;
2781
+ if (E.fragment_shading_rate_reference .attachment != AttachmentReference::UNUSED) {
2782
+ vrs_index = E.fragment_shading_rate_reference .attachment ;
2777
2783
}
2778
2784
}
2779
2785
@@ -4922,7 +4928,9 @@ Vector<uint8_t> RenderingDeviceDriverD3D12::pipeline_cache_serialize() {
4922
4928
4923
4929
// ----- SUBPASS -----
4924
4930
4925
- RDD::RenderPassID RenderingDeviceDriverD3D12::render_pass_create (VectorView<Attachment> p_attachments, VectorView<Subpass> p_subpasses, VectorView<SubpassDependency> p_subpass_dependencies, uint32_t p_view_count) {
4931
+ 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) {
4932
+ ERR_FAIL_COND_V_MSG (p_fragment_density_map_attachment.attachment != AttachmentReference::UNUSED, RenderPassID (), " Fragment density maps are not supported in D3D12." );
4933
+
4926
4934
// Pre-bookkeep.
4927
4935
RenderPassInfo *pass_info = VersatileResource::allocate<RenderPassInfo>(resources_allocator);
4928
4936
@@ -5023,7 +5031,7 @@ void RenderingDeviceDriverD3D12::command_begin_render_pass(CommandBufferID p_cmd
5023
5031
}
5024
5032
}
5025
5033
5026
- if (fb_info->vrs_attachment && vrs_capabilities. ss_image_supported ) {
5034
+ if (fb_info->vrs_attachment && fsr_capabilities. attachment_supported ) {
5027
5035
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
5028
5036
cmd_buf_info->cmd_list ->QueryInterface (cmd_list_5.GetAddressOf ());
5029
5037
if (cmd_list_5) {
@@ -5143,7 +5151,7 @@ void RenderingDeviceDriverD3D12::command_end_render_pass(CommandBufferID p_cmd_b
5143
5151
const FramebufferInfo *fb_info = cmd_buf_info->render_pass_state .fb_info ;
5144
5152
const RenderPassInfo *pass_info = cmd_buf_info->render_pass_state .pass_info ;
5145
5153
5146
- if (vrs_capabilities. ss_image_supported ) {
5154
+ if (fsr_capabilities. attachment_supported ) {
5147
5155
ComPtr<ID3D12GraphicsCommandList5> cmd_list_5;
5148
5156
cmd_buf_info->cmd_list ->QueryInterface (cmd_list_5.GetAddressOf ());
5149
5157
if (cmd_list_5) {
@@ -6173,12 +6181,6 @@ uint64_t RenderingDeviceDriverD3D12::limit_get(Limit p_limit) {
6173
6181
return subgroup_capabilities.supported_stages_flags_rd ();
6174
6182
case LIMIT_SUBGROUP_OPERATIONS:
6175
6183
return subgroup_capabilities.supported_operations_flags_rd ();
6176
- case LIMIT_VRS_TEXEL_WIDTH:
6177
- case LIMIT_VRS_TEXEL_HEIGHT:
6178
- return vrs_capabilities.ss_image_tile_size ;
6179
- case LIMIT_VRS_MAX_FRAGMENT_WIDTH:
6180
- case LIMIT_VRS_MAX_FRAGMENT_HEIGHT:
6181
- return vrs_capabilities.ss_max_fragment_size ;
6182
6184
default : {
6183
6185
#ifdef DEV_ENABLED
6184
6186
WARN_PRINT (" Returning maximum value for unknown limit " + itos (p_limit) + " ." );
@@ -6213,12 +6215,8 @@ uint64_t RenderingDeviceDriverD3D12::api_trait_get(ApiTrait p_trait) {
6213
6215
6214
6216
bool RenderingDeviceDriverD3D12::has_feature (Features p_feature) {
6215
6217
switch (p_feature) {
6216
- case SUPPORTS_MULTIVIEW:
6217
- return multiview_capabilities.is_supported && multiview_capabilities.max_view_count > 1 ;
6218
6218
case SUPPORTS_FSR_HALF_FLOAT:
6219
6219
return shader_capabilities.native_16bit_ops && storage_buffer_capabilities.storage_buffer_16_bit_access_is_supported ;
6220
- case SUPPORTS_ATTACHMENT_VRS:
6221
- return vrs_capabilities.ss_image_supported ;
6222
6220
case SUPPORTS_FRAGMENT_SHADER_WITH_ONLY_SIDE_EFFECTS:
6223
6221
return true ;
6224
6222
default :
@@ -6230,6 +6228,14 @@ const RDD::MultiviewCapabilities &RenderingDeviceDriverD3D12::get_multiview_capa
6230
6228
return multiview_capabilities;
6231
6229
}
6232
6230
6231
+ const RDD::FragmentShadingRateCapabilities &RenderingDeviceDriverD3D12::get_fragment_shading_rate_capabilities () {
6232
+ return fsr_capabilities;
6233
+ }
6234
+
6235
+ const RDD::FragmentDensityMapCapabilities &RenderingDeviceDriverD3D12::get_fragment_density_map_capabilities () {
6236
+ return fdm_capabilities;
6237
+ }
6238
+
6233
6239
String RenderingDeviceDriverD3D12::get_api_name () const {
6234
6240
return " D3D12" ;
6235
6241
}
@@ -6391,12 +6397,6 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6391
6397
device_capabilities.version_minor = feature_level % 10 ;
6392
6398
6393
6399
// Assume not supported until proven otherwise.
6394
- vrs_capabilities.draw_call_supported = false ;
6395
- vrs_capabilities.primitive_supported = false ;
6396
- vrs_capabilities.primitive_in_multiviewport = false ;
6397
- vrs_capabilities.ss_image_supported = false ;
6398
- vrs_capabilities.ss_image_tile_size = 1 ;
6399
- vrs_capabilities.additional_rates_supported = false ;
6400
6400
multiview_capabilities.is_supported = false ;
6401
6401
multiview_capabilities.geometry_shader_is_supported = false ;
6402
6402
multiview_capabilities.tessellation_shader_is_supported = false ;
@@ -6487,14 +6487,12 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6487
6487
res = device->CheckFeatureSupport (D3D12_FEATURE_D3D12_OPTIONS6, &options6, sizeof (options6));
6488
6488
if (SUCCEEDED (res)) {
6489
6489
if (options6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_1) {
6490
- vrs_capabilities. draw_call_supported = true ;
6490
+ fsr_capabilities. pipeline_supported = true ;
6491
6491
if (options6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_2) {
6492
- vrs_capabilities.primitive_supported = true ;
6493
- vrs_capabilities.primitive_in_multiviewport = options6.PerPrimitiveShadingRateSupportedWithViewportIndexing ;
6494
- vrs_capabilities.ss_image_supported = true ;
6495
- vrs_capabilities.ss_image_tile_size = options6.ShadingRateImageTileSize ;
6496
- vrs_capabilities.ss_max_fragment_size = 8 ; // TODO figure out if this is supplied and/or needed
6497
- vrs_capabilities.additional_rates_supported = options6.AdditionalShadingRatesSupported ;
6492
+ fsr_capabilities.primitive_supported = true ;
6493
+ fsr_capabilities.attachment_supported = true ;
6494
+ fsr_capabilities.min_texel_size = Size2i (options6.ShadingRateImageTileSize , options6.ShadingRateImageTileSize );
6495
+ fsr_capabilities.max_texel_size = Size2i (8 , 8 );
6498
6496
}
6499
6497
}
6500
6498
}
@@ -6506,19 +6504,16 @@ Error RenderingDeviceDriverD3D12::_check_capabilities() {
6506
6504
barrier_capabilities.enhanced_barriers_supported = options12.EnhancedBarriersSupported ;
6507
6505
}
6508
6506
6509
- if (vrs_capabilities. draw_call_supported || vrs_capabilities .primitive_supported || vrs_capabilities. ss_image_supported ) {
6507
+ if (fsr_capabilities. pipeline_supported || fsr_capabilities .primitive_supported || fsr_capabilities. attachment_supported ) {
6510
6508
print_verbose (" - D3D12 Variable Rate Shading supported:" );
6511
- if (vrs_capabilities. draw_call_supported ) {
6509
+ if (fsr_capabilities. pipeline_supported ) {
6512
6510
print_verbose (" Draw call" );
6513
6511
}
6514
- if (vrs_capabilities.primitive_supported ) {
6515
- print_verbose (String (" Per-primitive (multi-viewport: " ) + (vrs_capabilities.primitive_in_multiviewport ? " yes" : " no" ) + " )" );
6516
- }
6517
- if (vrs_capabilities.ss_image_supported ) {
6518
- print_verbose (String (" Screen-space image (tile size: " ) + itos (vrs_capabilities.ss_image_tile_size ) + " )" );
6512
+ if (fsr_capabilities.primitive_supported ) {
6513
+ print_verbose (" Primitive" );
6519
6514
}
6520
- if (vrs_capabilities. additional_rates_supported ) {
6521
- print_verbose (String (" Additional rates : " ) + (vrs_capabilities. additional_rates_supported ? " yes " : " no " ) );
6515
+ if (fsr_capabilities. attachment_supported ) {
6516
+ print_verbose (String (" Screen-space image (tile size : " ) + itos (fsr_capabilities. min_texel_size . x ) + " ) " );
6522
6517
}
6523
6518
} else {
6524
6519
print_verbose (" - D3D12 Variable Rate Shading not supported" );
0 commit comments