vkd3d: Expose TIER_2 Variable Rate Shading
Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
parent
9fb624a429
commit
5978f5958e
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue