Re: [Mesa-dev] [PATCH] radv: implement VK_EXT_conservative_rasterization

2018-09-14 Thread Samuel Pitoiset



On 9/14/18 11:10 AM, Bas Nieuwenhuizen wrote:

On Fri, Sep 14, 2018 at 10:31 AM Samuel Pitoiset
 wrote:




On 9/12/18 11:19 PM, Bas Nieuwenhuizen wrote:

On Wed, Sep 12, 2018 at 10:44 PM Samuel Pitoiset
 wrote:


Only supported by GFX9+.

The conservativeraster Sascha demo seems to work as expected.

Signed-off-by: Samuel Pitoiset 
---
   src/amd/vulkan/radv_device.c  | 14 +
   src/amd/vulkan/radv_extensions.py |  1 +
   src/amd/vulkan/radv_pipeline.c| 48 ++-
   3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 7917ed7ffe..60776a863e 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1152,6 +1152,20 @@ void radv_GetPhysicalDeviceProperties2(
  properties->protectedNoFault = false;
  break;
  }
+   case 
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+   VkPhysicalDeviceConservativeRasterizationPropertiesEXT 
*properties =
+   
(VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
+   properties->primitiveOverestimationSize = 0;
+   properties->maxExtraPrimitiveOverestimationSize = 0;
+   properties->extraPrimitiveOverestimationSizeGranularity 
= 0;
+   properties->primitiveUnderestimation = VK_FALSE;
+   properties->conservativePointAndLineRasterization = 
VK_FALSE;
+   properties->degenerateTrianglesRasterized = VK_FALSE;
+   properties->degenerateLinesRasterized = VK_FALSE;
+   properties->fullyCoveredFragmentShaderInputVariable = 
VK_FALSE;
+   properties->conservativeRasterizationPostDepthCoverage 
= VK_FALSE;
+   break;
+   }
  default:
  break;
  }
diff --git a/src/amd/vulkan/radv_extensions.py 
b/src/amd/vulkan/radv_extensions.py
index fa35aabd3b..584926df39 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -93,6 +93,7 @@ EXTENSIONS = [
   Extension('VK_EXT_direct_mode_display',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
   Extension('VK_EXT_acquire_xlib_display',  1, 
'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
   Extension('VK_EXT_conditional_rendering', 1, True),
+Extension('VK_EXT_conservative_rasterization',1, 
'device->rad_info.chip_class >= GFX9'),
   Extension('VK_EXT_display_surface_counter',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
   Extension('VK_EXT_display_control',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
   Extension('VK_EXT_debug_report',  9, True),
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ae269c32c4..c54949ed42 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2686,12 +2686,25 @@ radv_pipeline_generate_blend_state(struct radeon_cmdbuf 
*cs,
  pipeline->graphics.cb_target_mask = blend->cb_target_mask;
   }

+static const VkConservativeRasterizationModeEXT
+radv_get_conservative_raster_mode(const VkPipelineRasterizationStateCreateInfo 
*pCreateInfo)
+{
+   const VkPipelineRasterizationConservativeStateCreateInfoEXT 
*conservative_raster =
+   vk_find_struct_const(pCreateInfo->pNext, 
PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
+
+   if (!conservative_raster)
+   return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
+   return conservative_raster->conservativeRasterizationMode;
+}

   static void
   radv_pipeline_generate_raster_state(struct radeon_cmdbuf *cs,
+   struct radv_pipeline *pipeline,
   const VkGraphicsPipelineCreateInfo 
*pCreateInfo)
   {
  const VkPipelineRasterizationStateCreateInfo *vkraster = 
pCreateInfo->pRasterizationState;
+   const VkConservativeRasterizationModeEXT mode =
+   radv_get_conservative_raster_mode(vkraster);

  radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
 S_028810_PS_UCP_MODE(3) |
@@ -2725,6 +2738,39 @@ radv_pipeline_generate_raster_state(struct radeon_cmdbuf 
*cs,
 
S_028814_POLY_OFFSET_FRONT_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
 
S_028814_POLY_OFFSET_BACK_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
 
S_028814_POLY_OFFSET_PARA_ENABLE(vkraster->depthBiasEnable ? 1 : 0));
+
+   /* Conservative rasterization. */
+   if (mode != VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT) {
+   struct radv_multisample_state *ms = >graphics.ms;
+   

Re: [Mesa-dev] [PATCH] radv: implement VK_EXT_conservative_rasterization

2018-09-14 Thread Bas Nieuwenhuizen
On Fri, Sep 14, 2018 at 10:31 AM Samuel Pitoiset
 wrote:
>
>
>
> On 9/12/18 11:19 PM, Bas Nieuwenhuizen wrote:
> > On Wed, Sep 12, 2018 at 10:44 PM Samuel Pitoiset
> >  wrote:
> >>
> >> Only supported by GFX9+.
> >>
> >> The conservativeraster Sascha demo seems to work as expected.
> >>
> >> Signed-off-by: Samuel Pitoiset 
> >> ---
> >>   src/amd/vulkan/radv_device.c  | 14 +
> >>   src/amd/vulkan/radv_extensions.py |  1 +
> >>   src/amd/vulkan/radv_pipeline.c| 48 ++-
> >>   3 files changed, 62 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> >> index 7917ed7ffe..60776a863e 100644
> >> --- a/src/amd/vulkan/radv_device.c
> >> +++ b/src/amd/vulkan/radv_device.c
> >> @@ -1152,6 +1152,20 @@ void radv_GetPhysicalDeviceProperties2(
> >>  properties->protectedNoFault = false;
> >>  break;
> >>  }
> >> +   case 
> >> VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
> >>  {
> >> +   
> >> VkPhysicalDeviceConservativeRasterizationPropertiesEXT *properties =
> >> +   
> >> (VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
> >> +   properties->primitiveOverestimationSize = 0;
> >> +   properties->maxExtraPrimitiveOverestimationSize = 
> >> 0;
> >> +   
> >> properties->extraPrimitiveOverestimationSizeGranularity = 0;
> >> +   properties->primitiveUnderestimation = VK_FALSE;
> >> +   properties->conservativePointAndLineRasterization 
> >> = VK_FALSE;
> >> +   properties->degenerateTrianglesRasterized = 
> >> VK_FALSE;
> >> +   properties->degenerateLinesRasterized = VK_FALSE;
> >> +   
> >> properties->fullyCoveredFragmentShaderInputVariable = VK_FALSE;
> >> +   
> >> properties->conservativeRasterizationPostDepthCoverage = VK_FALSE;
> >> +   break;
> >> +   }
> >>  default:
> >>  break;
> >>  }
> >> diff --git a/src/amd/vulkan/radv_extensions.py 
> >> b/src/amd/vulkan/radv_extensions.py
> >> index fa35aabd3b..584926df39 100644
> >> --- a/src/amd/vulkan/radv_extensions.py
> >> +++ b/src/amd/vulkan/radv_extensions.py
> >> @@ -93,6 +93,7 @@ EXTENSIONS = [
> >>   Extension('VK_EXT_direct_mode_display',   1, 
> >> 'VK_USE_PLATFORM_DISPLAY_KHR'),
> >>   Extension('VK_EXT_acquire_xlib_display',  1, 
> >> 'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
> >>   Extension('VK_EXT_conditional_rendering', 1, True),
> >> +Extension('VK_EXT_conservative_rasterization',1, 
> >> 'device->rad_info.chip_class >= GFX9'),
> >>   Extension('VK_EXT_display_surface_counter',   1, 
> >> 'VK_USE_PLATFORM_DISPLAY_KHR'),
> >>   Extension('VK_EXT_display_control',   1, 
> >> 'VK_USE_PLATFORM_DISPLAY_KHR'),
> >>   Extension('VK_EXT_debug_report',  9, True),
> >> diff --git a/src/amd/vulkan/radv_pipeline.c 
> >> b/src/amd/vulkan/radv_pipeline.c
> >> index ae269c32c4..c54949ed42 100644
> >> --- a/src/amd/vulkan/radv_pipeline.c
> >> +++ b/src/amd/vulkan/radv_pipeline.c
> >> @@ -2686,12 +2686,25 @@ radv_pipeline_generate_blend_state(struct 
> >> radeon_cmdbuf *cs,
> >>  pipeline->graphics.cb_target_mask = blend->cb_target_mask;
> >>   }
> >>
> >> +static const VkConservativeRasterizationModeEXT
> >> +radv_get_conservative_raster_mode(const 
> >> VkPipelineRasterizationStateCreateInfo *pCreateInfo)
> >> +{
> >> +   const VkPipelineRasterizationConservativeStateCreateInfoEXT 
> >> *conservative_raster =
> >> +   vk_find_struct_const(pCreateInfo->pNext, 
> >> PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
> >> +
> >> +   if (!conservative_raster)
> >> +   return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
> >> +   return conservative_raster->conservativeRasterizationMode;
> >> +}
> >>
> >>   static void
> >>   radv_pipeline_generate_raster_state(struct radeon_cmdbuf *cs,
> >> +   struct radv_pipeline *pipeline,
> >>   const VkGraphicsPipelineCreateInfo 
> >> *pCreateInfo)
> >>   {
> >>  const VkPipelineRasterizationStateCreateInfo *vkraster = 
> >> pCreateInfo->pRasterizationState;
> >> +   const VkConservativeRasterizationModeEXT mode =
> >> +   radv_get_conservative_raster_mode(vkraster);
> >>
> >>  radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
> >> S_028810_PS_UCP_MODE(3) |
> >> @@ -2725,6 +2738,39 @@ radv_pipeline_generate_raster_state(struct 
> >> radeon_cmdbuf *cs,
> >> 
> >> 

Re: [Mesa-dev] [PATCH] radv: implement VK_EXT_conservative_rasterization

2018-09-14 Thread Samuel Pitoiset



On 9/12/18 11:19 PM, Bas Nieuwenhuizen wrote:

On Wed, Sep 12, 2018 at 10:44 PM Samuel Pitoiset
 wrote:


Only supported by GFX9+.

The conservativeraster Sascha demo seems to work as expected.

Signed-off-by: Samuel Pitoiset 
---
  src/amd/vulkan/radv_device.c  | 14 +
  src/amd/vulkan/radv_extensions.py |  1 +
  src/amd/vulkan/radv_pipeline.c| 48 ++-
  3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 7917ed7ffe..60776a863e 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1152,6 +1152,20 @@ void radv_GetPhysicalDeviceProperties2(
 properties->protectedNoFault = false;
 break;
 }
+   case 
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+   VkPhysicalDeviceConservativeRasterizationPropertiesEXT 
*properties =
+   
(VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
+   properties->primitiveOverestimationSize = 0;
+   properties->maxExtraPrimitiveOverestimationSize = 0;
+   properties->extraPrimitiveOverestimationSizeGranularity 
= 0;
+   properties->primitiveUnderestimation = VK_FALSE;
+   properties->conservativePointAndLineRasterization = 
VK_FALSE;
+   properties->degenerateTrianglesRasterized = VK_FALSE;
+   properties->degenerateLinesRasterized = VK_FALSE;
+   properties->fullyCoveredFragmentShaderInputVariable = 
VK_FALSE;
+   properties->conservativeRasterizationPostDepthCoverage 
= VK_FALSE;
+   break;
+   }
 default:
 break;
 }
diff --git a/src/amd/vulkan/radv_extensions.py 
b/src/amd/vulkan/radv_extensions.py
index fa35aabd3b..584926df39 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -93,6 +93,7 @@ EXTENSIONS = [
  Extension('VK_EXT_direct_mode_display',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
  Extension('VK_EXT_acquire_xlib_display',  1, 
'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
  Extension('VK_EXT_conditional_rendering', 1, True),
+Extension('VK_EXT_conservative_rasterization',1, 
'device->rad_info.chip_class >= GFX9'),
  Extension('VK_EXT_display_surface_counter',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
  Extension('VK_EXT_display_control',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
  Extension('VK_EXT_debug_report',  9, True),
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ae269c32c4..c54949ed42 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2686,12 +2686,25 @@ radv_pipeline_generate_blend_state(struct radeon_cmdbuf 
*cs,
 pipeline->graphics.cb_target_mask = blend->cb_target_mask;
  }

+static const VkConservativeRasterizationModeEXT
+radv_get_conservative_raster_mode(const VkPipelineRasterizationStateCreateInfo 
*pCreateInfo)
+{
+   const VkPipelineRasterizationConservativeStateCreateInfoEXT 
*conservative_raster =
+   vk_find_struct_const(pCreateInfo->pNext, 
PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
+
+   if (!conservative_raster)
+   return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
+   return conservative_raster->conservativeRasterizationMode;
+}

  static void
  radv_pipeline_generate_raster_state(struct radeon_cmdbuf *cs,
+   struct radv_pipeline *pipeline,
  const VkGraphicsPipelineCreateInfo 
*pCreateInfo)
  {
 const VkPipelineRasterizationStateCreateInfo *vkraster = 
pCreateInfo->pRasterizationState;
+   const VkConservativeRasterizationModeEXT mode =
+   radv_get_conservative_raster_mode(vkraster);

 radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
S_028810_PS_UCP_MODE(3) |
@@ -2725,6 +2738,39 @@ radv_pipeline_generate_raster_state(struct radeon_cmdbuf 
*cs,

S_028814_POLY_OFFSET_FRONT_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |

S_028814_POLY_OFFSET_BACK_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |

S_028814_POLY_OFFSET_PARA_ENABLE(vkraster->depthBiasEnable ? 1 : 0));
+
+   /* Conservative rasterization. */
+   if (mode != VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT) {
+   struct radv_multisample_state *ms = >graphics.ms;
+   uint32_t pa_sc_conservative_rast;
+
+   ms->pa_sc_aa_config |= S_028BE0_AA_MASK_CENTROID_DTMN(1);
+   

Re: [Mesa-dev] [PATCH] radv: implement VK_EXT_conservative_rasterization

2018-09-12 Thread Bas Nieuwenhuizen
On Wed, Sep 12, 2018 at 10:44 PM Samuel Pitoiset
 wrote:
>
> Only supported by GFX9+.
>
> The conservativeraster Sascha demo seems to work as expected.
>
> Signed-off-by: Samuel Pitoiset 
> ---
>  src/amd/vulkan/radv_device.c  | 14 +
>  src/amd/vulkan/radv_extensions.py |  1 +
>  src/amd/vulkan/radv_pipeline.c| 48 ++-
>  3 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
> index 7917ed7ffe..60776a863e 100644
> --- a/src/amd/vulkan/radv_device.c
> +++ b/src/amd/vulkan/radv_device.c
> @@ -1152,6 +1152,20 @@ void radv_GetPhysicalDeviceProperties2(
> properties->protectedNoFault = false;
> break;
> }
> +   case 
> VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
> +   
> VkPhysicalDeviceConservativeRasterizationPropertiesEXT *properties =
> +   
> (VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
> +   properties->primitiveOverestimationSize = 0;
> +   properties->maxExtraPrimitiveOverestimationSize = 0;
> +   
> properties->extraPrimitiveOverestimationSizeGranularity = 0;
> +   properties->primitiveUnderestimation = VK_FALSE;
> +   properties->conservativePointAndLineRasterization = 
> VK_FALSE;
> +   properties->degenerateTrianglesRasterized = VK_FALSE;
> +   properties->degenerateLinesRasterized = VK_FALSE;
> +   properties->fullyCoveredFragmentShaderInputVariable = 
> VK_FALSE;
> +   
> properties->conservativeRasterizationPostDepthCoverage = VK_FALSE;
> +   break;
> +   }
> default:
> break;
> }
> diff --git a/src/amd/vulkan/radv_extensions.py 
> b/src/amd/vulkan/radv_extensions.py
> index fa35aabd3b..584926df39 100644
> --- a/src/amd/vulkan/radv_extensions.py
> +++ b/src/amd/vulkan/radv_extensions.py
> @@ -93,6 +93,7 @@ EXTENSIONS = [
>  Extension('VK_EXT_direct_mode_display',   1, 
> 'VK_USE_PLATFORM_DISPLAY_KHR'),
>  Extension('VK_EXT_acquire_xlib_display',  1, 
> 'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
>  Extension('VK_EXT_conditional_rendering', 1, True),
> +Extension('VK_EXT_conservative_rasterization',1, 
> 'device->rad_info.chip_class >= GFX9'),
>  Extension('VK_EXT_display_surface_counter',   1, 
> 'VK_USE_PLATFORM_DISPLAY_KHR'),
>  Extension('VK_EXT_display_control',   1, 
> 'VK_USE_PLATFORM_DISPLAY_KHR'),
>  Extension('VK_EXT_debug_report',  9, True),
> diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
> index ae269c32c4..c54949ed42 100644
> --- a/src/amd/vulkan/radv_pipeline.c
> +++ b/src/amd/vulkan/radv_pipeline.c
> @@ -2686,12 +2686,25 @@ radv_pipeline_generate_blend_state(struct 
> radeon_cmdbuf *cs,
> pipeline->graphics.cb_target_mask = blend->cb_target_mask;
>  }
>
> +static const VkConservativeRasterizationModeEXT
> +radv_get_conservative_raster_mode(const 
> VkPipelineRasterizationStateCreateInfo *pCreateInfo)
> +{
> +   const VkPipelineRasterizationConservativeStateCreateInfoEXT 
> *conservative_raster =
> +   vk_find_struct_const(pCreateInfo->pNext, 
> PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
> +
> +   if (!conservative_raster)
> +   return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
> +   return conservative_raster->conservativeRasterizationMode;
> +}
>
>  static void
>  radv_pipeline_generate_raster_state(struct radeon_cmdbuf *cs,
> +   struct radv_pipeline *pipeline,
>  const VkGraphicsPipelineCreateInfo 
> *pCreateInfo)
>  {
> const VkPipelineRasterizationStateCreateInfo *vkraster = 
> pCreateInfo->pRasterizationState;
> +   const VkConservativeRasterizationModeEXT mode =
> +   radv_get_conservative_raster_mode(vkraster);
>
> radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
>S_028810_PS_UCP_MODE(3) |
> @@ -2725,6 +2738,39 @@ radv_pipeline_generate_raster_state(struct 
> radeon_cmdbuf *cs,
>
> S_028814_POLY_OFFSET_FRONT_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
>
> S_028814_POLY_OFFSET_BACK_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
>
> S_028814_POLY_OFFSET_PARA_ENABLE(vkraster->depthBiasEnable ? 1 : 0));
> +
> +   /* Conservative rasterization. */
> +   if (mode != VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT) {
> +   struct radv_multisample_state *ms = >graphics.ms;
> +   

[Mesa-dev] [PATCH] radv: implement VK_EXT_conservative_rasterization

2018-09-12 Thread Samuel Pitoiset
Only supported by GFX9+.

The conservativeraster Sascha demo seems to work as expected.

Signed-off-by: Samuel Pitoiset 
---
 src/amd/vulkan/radv_device.c  | 14 +
 src/amd/vulkan/radv_extensions.py |  1 +
 src/amd/vulkan/radv_pipeline.c| 48 ++-
 3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 7917ed7ffe..60776a863e 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -1152,6 +1152,20 @@ void radv_GetPhysicalDeviceProperties2(
properties->protectedNoFault = false;
break;
}
+   case 
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT: {
+   VkPhysicalDeviceConservativeRasterizationPropertiesEXT 
*properties =
+   
(VkPhysicalDeviceConservativeRasterizationPropertiesEXT *)ext;
+   properties->primitiveOverestimationSize = 0;
+   properties->maxExtraPrimitiveOverestimationSize = 0;
+   properties->extraPrimitiveOverestimationSizeGranularity 
= 0;
+   properties->primitiveUnderestimation = VK_FALSE;
+   properties->conservativePointAndLineRasterization = 
VK_FALSE;
+   properties->degenerateTrianglesRasterized = VK_FALSE;
+   properties->degenerateLinesRasterized = VK_FALSE;
+   properties->fullyCoveredFragmentShaderInputVariable = 
VK_FALSE;
+   properties->conservativeRasterizationPostDepthCoverage 
= VK_FALSE;
+   break;
+   }
default:
break;
}
diff --git a/src/amd/vulkan/radv_extensions.py 
b/src/amd/vulkan/radv_extensions.py
index fa35aabd3b..584926df39 100644
--- a/src/amd/vulkan/radv_extensions.py
+++ b/src/amd/vulkan/radv_extensions.py
@@ -93,6 +93,7 @@ EXTENSIONS = [
 Extension('VK_EXT_direct_mode_display',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
 Extension('VK_EXT_acquire_xlib_display',  1, 
'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
 Extension('VK_EXT_conditional_rendering', 1, True),
+Extension('VK_EXT_conservative_rasterization',1, 
'device->rad_info.chip_class >= GFX9'),
 Extension('VK_EXT_display_surface_counter',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
 Extension('VK_EXT_display_control',   1, 
'VK_USE_PLATFORM_DISPLAY_KHR'),
 Extension('VK_EXT_debug_report',  9, True),
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ae269c32c4..c54949ed42 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2686,12 +2686,25 @@ radv_pipeline_generate_blend_state(struct radeon_cmdbuf 
*cs,
pipeline->graphics.cb_target_mask = blend->cb_target_mask;
 }
 
+static const VkConservativeRasterizationModeEXT
+radv_get_conservative_raster_mode(const VkPipelineRasterizationStateCreateInfo 
*pCreateInfo)
+{
+   const VkPipelineRasterizationConservativeStateCreateInfoEXT 
*conservative_raster =
+   vk_find_struct_const(pCreateInfo->pNext, 
PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
+
+   if (!conservative_raster)
+   return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
+   return conservative_raster->conservativeRasterizationMode;
+}
 
 static void
 radv_pipeline_generate_raster_state(struct radeon_cmdbuf *cs,
+   struct radv_pipeline *pipeline,
 const VkGraphicsPipelineCreateInfo 
*pCreateInfo)
 {
const VkPipelineRasterizationStateCreateInfo *vkraster = 
pCreateInfo->pRasterizationState;
+   const VkConservativeRasterizationModeEXT mode =
+   radv_get_conservative_raster_mode(vkraster);
 
radeon_set_context_reg(cs, R_028810_PA_CL_CLIP_CNTL,
   S_028810_PS_UCP_MODE(3) |
@@ -2725,6 +2738,39 @@ radv_pipeline_generate_raster_state(struct radeon_cmdbuf 
*cs,
   
S_028814_POLY_OFFSET_FRONT_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
   
S_028814_POLY_OFFSET_BACK_ENABLE(vkraster->depthBiasEnable ? 1 : 0) |
   
S_028814_POLY_OFFSET_PARA_ENABLE(vkraster->depthBiasEnable ? 1 : 0));
+
+   /* Conservative rasterization. */
+   if (mode != VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT) {
+   struct radv_multisample_state *ms = >graphics.ms;
+   uint32_t pa_sc_conservative_rast;
+
+   ms->pa_sc_aa_config |= S_028BE0_AA_MASK_CENTROID_DTMN(1);
+   ms->db_eqaa |= S_028804_ENABLE_POSTZ_OVERRASTERIZATION(1) |
+  S_028804_OVERRASTERIZATION_AMOUNT(4);
+
+