vkd3d: Expose TIER_2 Variable Rate Shading

Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
Joshua Ashton 2021-03-25 03:15:00 +00:00 committed by Hans-Kristian Arntzen
parent 9fb624a429
commit 5978f5958e
1 changed files with 49 additions and 15 deletions

View File

@ -811,6 +811,13 @@ static uint32_t vkd3d_physical_device_get_time_domains(struct d3d12_device *devi
return result;
}
bool d3d12_device_supports_ray_tracing_tier_1_0(const struct d3d12_device *device)
{
return device->device_info.acceleration_structure_features.accelerationStructure &&
device->device_info.ray_tracing_pipeline_features.rayTracingPipeline &&
device->d3d12_caps.options5.RaytracingTier >= D3D12_RAYTRACING_TIER_1_0;
}
bool d3d12_device_supports_variable_shading_rate_tier_1(struct d3d12_device *device)
{
const struct vkd3d_physical_device_info *info = &device->device_info;
@ -819,11 +826,35 @@ bool d3d12_device_supports_variable_shading_rate_tier_1(struct d3d12_device *dev
(device->vk_info.device_limits.framebufferColorSampleCounts & VK_SAMPLE_COUNT_2_BIT);
}
bool d3d12_device_supports_ray_tracing_tier_1_0(const struct d3d12_device *device)
UINT d3d12_determine_shading_rate_image_tile_size(struct d3d12_device *device)
{
return device->device_info.acceleration_structure_features.accelerationStructure &&
device->device_info.ray_tracing_pipeline_features.rayTracingPipeline &&
device->d3d12_caps.options5.RaytracingTier >= D3D12_RAYTRACING_TIER_1_0;
VkExtent2D min_texel_size = device->device_info.fragment_shading_rate_properties.minFragmentShadingRateAttachmentTexelSize;
VkExtent2D max_texel_size = device->device_info.fragment_shading_rate_properties.maxFragmentShadingRateAttachmentTexelSize;
const UINT valid_shading_rate_image_tile_sizes[] =
{
8, 16, 32
};
for (uint32_t i = 0; i < ARRAY_SIZE(valid_shading_rate_image_tile_sizes); i++)
{
UINT tile_size = valid_shading_rate_image_tile_sizes[i];
if (tile_size >= min_texel_size.width && tile_size >= min_texel_size.height &&
tile_size <= max_texel_size.height && tile_size <= max_texel_size.height)
return tile_size;
}
/* No valid D3D12 tile size. */
return 0;
}
bool d3d12_device_supports_variable_shading_rate_tier_2(struct d3d12_device *device)
{
const struct vkd3d_physical_device_info *info = &device->device_info;
return info->fragment_shading_rate_properties.fragmentShadingRateNonTrivialCombinerOps &&
info->fragment_shading_rate_features.attachmentFragmentShadingRate &&
info->fragment_shading_rate_features.primitiveFragmentShadingRate &&
d3d12_determine_shading_rate_image_tile_size(device) != 0;
}
static D3D12_VARIABLE_SHADING_RATE_TIER d3d12_device_determine_variable_shading_rate_tier(struct d3d12_device *device)
@ -831,15 +862,10 @@ static D3D12_VARIABLE_SHADING_RATE_TIER d3d12_device_determine_variable_shading_
if (!d3d12_device_supports_variable_shading_rate_tier_1(device))
return D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED;
/* TODO: TIER_2
- impl RSSetShadingRateImage
- prop fragmentShadingRateNonTrivialCombinerOp
- feat primitiveFragmentShadingRate
- DXIL bringup for PrimitiveShadingRateKHR built-in
- feat attachmentFragmentShadingRate
*/
if (!d3d12_device_supports_variable_shading_rate_tier_2(device))
return D3D12_VARIABLE_SHADING_RATE_TIER_1;
return D3D12_VARIABLE_SHADING_RATE_TIER_1;
return D3D12_VARIABLE_SHADING_RATE_TIER_2;
}
static const struct
@ -4708,10 +4734,18 @@ static void d3d12_device_caps_init_feature_options6(struct d3d12_device *device)
options6->AdditionalShadingRatesSupported = device->device_info.additional_shading_rates_supported;
options6->VariableShadingRateTier = d3d12_device_determine_variable_shading_rate_tier(device);
if (options6->VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_2)
{
options6->ShadingRateImageTileSize = d3d12_determine_shading_rate_image_tile_size(device);
/* Currently not supported, requires TIER_2 shading rate */
options6->PerPrimitiveShadingRateSupportedWithViewportIndexing = FALSE;
options6->ShadingRateImageTileSize = 0;
options6->PerPrimitiveShadingRateSupportedWithViewportIndexing =
device->device_info.fragment_shading_rate_properties.primitiveFragmentShadingRateWithMultipleViewports;
}
else
{
options6->ShadingRateImageTileSize = 0;
options6->PerPrimitiveShadingRateSupportedWithViewportIndexing = FALSE;
}
/* Not implemented */
options6->BackgroundProcessingSupported = FALSE;
}