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;
|
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)
|
bool d3d12_device_supports_variable_shading_rate_tier_1(struct d3d12_device *device)
|
||||||
{
|
{
|
||||||
const struct vkd3d_physical_device_info *info = &device->device_info;
|
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);
|
(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 &&
|
VkExtent2D min_texel_size = device->device_info.fragment_shading_rate_properties.minFragmentShadingRateAttachmentTexelSize;
|
||||||
device->device_info.ray_tracing_pipeline_features.rayTracingPipeline &&
|
VkExtent2D max_texel_size = device->device_info.fragment_shading_rate_properties.maxFragmentShadingRateAttachmentTexelSize;
|
||||||
device->d3d12_caps.options5.RaytracingTier >= D3D12_RAYTRACING_TIER_1_0;
|
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)
|
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))
|
if (!d3d12_device_supports_variable_shading_rate_tier_1(device))
|
||||||
return D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED;
|
return D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED;
|
||||||
|
|
||||||
/* TODO: TIER_2
|
if (!d3d12_device_supports_variable_shading_rate_tier_2(device))
|
||||||
- impl RSSetShadingRateImage
|
return D3D12_VARIABLE_SHADING_RATE_TIER_1;
|
||||||
- prop fragmentShadingRateNonTrivialCombinerOp
|
|
||||||
- feat primitiveFragmentShadingRate
|
|
||||||
- DXIL bringup for PrimitiveShadingRateKHR built-in
|
|
||||||
- feat attachmentFragmentShadingRate
|
|
||||||
*/
|
|
||||||
|
|
||||||
return D3D12_VARIABLE_SHADING_RATE_TIER_1;
|
return D3D12_VARIABLE_SHADING_RATE_TIER_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct
|
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->AdditionalShadingRatesSupported = device->device_info.additional_shading_rates_supported;
|
||||||
options6->VariableShadingRateTier = d3d12_device_determine_variable_shading_rate_tier(device);
|
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 =
|
||||||
options6->PerPrimitiveShadingRateSupportedWithViewportIndexing = FALSE;
|
device->device_info.fragment_shading_rate_properties.primitiveFragmentShadingRateWithMultipleViewports;
|
||||||
options6->ShadingRateImageTileSize = 0;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
options6->ShadingRateImageTileSize = 0;
|
||||||
|
options6->PerPrimitiveShadingRateSupportedWithViewportIndexing = FALSE;
|
||||||
|
}
|
||||||
/* Not implemented */
|
/* Not implemented */
|
||||||
options6->BackgroundProcessingSupported = FALSE;
|
options6->BackgroundProcessingSupported = FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue