radv: implement dynamic sample locations enable
VK_EXT_sample_locations is only supported on < GFX10 due to some weird issues on recent GPUs. extendedDynamicState3SampleLocationsEnable is only enabled on GFX6-GFX9 for the same reason. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22947>
This commit is contained in:
@@ -1 +1,2 @@
|
||||
VK_EXT_attachment_feedback_loop_dynamic_state on RADV
|
||||
extendedDynamicState3SampleLocationsEnable on RADV
|
||||
|
@@ -203,6 +203,7 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy
|
||||
RADV_CMP_COPY(vk.ms.alpha_to_coverage_enable, RADV_DYNAMIC_ALPHA_TO_COVERAGE_ENABLE);
|
||||
RADV_CMP_COPY(vk.ms.sample_mask, RADV_DYNAMIC_SAMPLE_MASK);
|
||||
RADV_CMP_COPY(vk.ms.rasterization_samples, RADV_DYNAMIC_RASTERIZATION_SAMPLES);
|
||||
RADV_CMP_COPY(vk.ms.sample_locations_enable, RADV_DYNAMIC_SAMPLE_LOCATIONS_ENABLE);
|
||||
|
||||
RADV_CMP_COPY(vk.ds.depth.bounds_test.min, RADV_DYNAMIC_DEPTH_BOUNDS);
|
||||
RADV_CMP_COPY(vk.ds.depth.bounds_test.max, RADV_DYNAMIC_DEPTH_BOUNDS);
|
||||
@@ -1088,7 +1089,7 @@ radv_emit_sample_locations(struct radv_cmd_buffer *cmd_buffer)
|
||||
VkOffset2D sample_locs[4][8]; /* 8 is the max. sample count supported */
|
||||
uint64_t centroid_priority;
|
||||
|
||||
if (!d->sample_location.count)
|
||||
if (!d->sample_location.count || !d->vk.ms.sample_locations_enable)
|
||||
return;
|
||||
|
||||
/* Convert the user sample locations to hardware sample locations. */
|
||||
@@ -6485,8 +6486,6 @@ radv_bind_multisample_state(struct radv_cmd_buffer *cmd_buffer,
|
||||
cmd_buffer->state.ms.sample_shading_enable = true;
|
||||
cmd_buffer->state.ms.min_sample_shading = ms->min_sample_shading;
|
||||
}
|
||||
|
||||
cmd_buffer->state.ms.uses_user_sample_locations = ms->uses_user_sample_locations;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -7564,6 +7563,17 @@ radv_CmdSetColorBlendEquationEXT(VkCommandBuffer commandBuffer, uint32_t firstAt
|
||||
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_EQUATION;
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
radv_CmdSetSampleLocationsEnableEXT(VkCommandBuffer commandBuffer, VkBool32 sampleLocationsEnable)
|
||||
{
|
||||
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
struct radv_cmd_state *state = &cmd_buffer->state;
|
||||
|
||||
state->dynamic.vk.ms.sample_locations_enable = sampleLocationsEnable;
|
||||
|
||||
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS_ENABLE;
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
radv_CmdSetDiscardRectangleEnableEXT(VkCommandBuffer commandBuffer, VkBool32 discardRectangleEnable)
|
||||
{
|
||||
@@ -8953,7 +8963,7 @@ radv_get_ngg_culling_settings(struct radv_cmd_buffer *cmd_buffer, bool vp_y_inve
|
||||
/* Small primitive culling assumes a sample position at (0.5, 0.5)
|
||||
* so don't enable it with user sample locations.
|
||||
*/
|
||||
if (!cmd_buffer->state.ms.uses_user_sample_locations) {
|
||||
if (!d->vk.ms.sample_locations_enable) {
|
||||
nggc_settings |= radv_nggc_small_primitives;
|
||||
|
||||
/* small_prim_precision = num_samples / 2^subpixel_bits
|
||||
@@ -9061,7 +9071,8 @@ radv_emit_all_graphics_states(struct radv_cmd_buffer *cmd_buffer, const struct r
|
||||
(RADV_CMD_DIRTY_PIPELINE | RADV_CMD_DIRTY_DYNAMIC_CULL_MODE |
|
||||
RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE | RADV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE |
|
||||
RADV_CMD_DIRTY_DYNAMIC_VIEWPORT | RADV_CMD_DIRTY_DYNAMIC_CONSERVATIVE_RAST_MODE |
|
||||
RADV_CMD_DIRTY_DYNAMIC_RASTERIZATION_SAMPLES | RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY)) &&
|
||||
RADV_CMD_DIRTY_DYNAMIC_RASTERIZATION_SAMPLES | RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY |
|
||||
RADV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS_ENABLE)) &&
|
||||
cmd_buffer->state.has_nggc)
|
||||
radv_emit_ngg_culling_state(cmd_buffer);
|
||||
|
||||
|
@@ -1244,7 +1244,7 @@ radv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
||||
features->extendedDynamicState3ColorWriteMask = true;
|
||||
features->extendedDynamicState3RasterizationSamples = true;
|
||||
features->extendedDynamicState3ColorBlendEquation = true;
|
||||
features->extendedDynamicState3SampleLocationsEnable = false; /* TODO */
|
||||
features->extendedDynamicState3SampleLocationsEnable = pdevice->rad_info.gfx_level < GFX10;
|
||||
features->extendedDynamicState3LineRasterizationMode = true;
|
||||
features->extendedDynamicState3ExtraPrimitiveOverestimationSize = false;
|
||||
features->extendedDynamicState3AlphaToOneEnable = false;
|
||||
|
@@ -370,8 +370,6 @@ radv_pipeline_init_multisample_state(const struct radv_device *device,
|
||||
ms->sample_shading_enable = true;
|
||||
ms->min_sample_shading = state->ms->min_sample_shading;
|
||||
}
|
||||
|
||||
ms->uses_user_sample_locations = state->ms && state->ms->sample_locations_enable;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@@ -515,6 +513,8 @@ radv_dynamic_state_mask(VkDynamicState state)
|
||||
return RADV_DYNAMIC_DISCARD_RECTANGLE_MODE;
|
||||
case VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT:
|
||||
return RADV_DYNAMIC_ATTACHMENT_FEEDBACK_LOOP_ENABLE;
|
||||
case VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT:
|
||||
return RADV_DYNAMIC_SAMPLE_LOCATIONS_ENABLE;
|
||||
default:
|
||||
unreachable("Unhandled dynamic state");
|
||||
}
|
||||
@@ -590,7 +590,8 @@ radv_pipeline_needed_dynamic_state(const struct radv_graphics_pipeline *pipeline
|
||||
!state->dr->rectangle_count)
|
||||
states &= ~RADV_DYNAMIC_DISCARD_RECTANGLE;
|
||||
|
||||
if (!state->ms || !state->ms->sample_locations_enable)
|
||||
if (!(pipeline->dynamic_states & RADV_DYNAMIC_SAMPLE_LOCATIONS_ENABLE) &&
|
||||
(!state->ms || !state->ms->sample_locations_enable))
|
||||
states &= ~RADV_DYNAMIC_SAMPLE_LOCATIONS;
|
||||
|
||||
if (!(pipeline->dynamic_states & RADV_DYNAMIC_LINE_STIPPLE_ENABLE) &&
|
||||
@@ -1041,6 +1042,10 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline,
|
||||
dynamic->vk.ms.rasterization_samples = state->ms->rasterization_samples;
|
||||
}
|
||||
|
||||
if (states & RADV_DYNAMIC_SAMPLE_LOCATIONS_ENABLE) {
|
||||
dynamic->vk.ms.sample_locations_enable = state->ms->sample_locations_enable;
|
||||
}
|
||||
|
||||
if (states & RADV_DYNAMIC_SAMPLE_LOCATIONS) {
|
||||
unsigned count = state->ms->sample_locations->per_pixel *
|
||||
state->ms->sample_locations->grid_size.width *
|
||||
|
@@ -1279,7 +1279,8 @@ enum radv_dynamic_state_bits {
|
||||
RADV_DYNAMIC_DISCARD_RECTANGLE_ENABLE = 1ull << 46,
|
||||
RADV_DYNAMIC_DISCARD_RECTANGLE_MODE = 1ull << 47,
|
||||
RADV_DYNAMIC_ATTACHMENT_FEEDBACK_LOOP_ENABLE = 1ull << 48,
|
||||
RADV_DYNAMIC_ALL = (1ull << 49) - 1,
|
||||
RADV_DYNAMIC_SAMPLE_LOCATIONS_ENABLE = 1ull << 49,
|
||||
RADV_DYNAMIC_ALL = (1ull << 50) - 1,
|
||||
};
|
||||
|
||||
enum radv_cmd_dirty_bits {
|
||||
@@ -1334,16 +1335,17 @@ enum radv_cmd_dirty_bits {
|
||||
RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE_ENABLE = 1ull << 46,
|
||||
RADV_CMD_DIRTY_DYNAMIC_DISCARD_RECTANGLE_MODE = 1ull << 47,
|
||||
RADV_CMD_DIRTY_DYNAMIC_ATTACHMENT_FEEDBACK_LOOP_ENABLE = 1ull << 48,
|
||||
RADV_CMD_DIRTY_DYNAMIC_ALL = (1ull << 49) - 1,
|
||||
RADV_CMD_DIRTY_PIPELINE = 1ull << 49,
|
||||
RADV_CMD_DIRTY_INDEX_BUFFER = 1ull << 50,
|
||||
RADV_CMD_DIRTY_FRAMEBUFFER = 1ull << 51,
|
||||
RADV_CMD_DIRTY_VERTEX_BUFFER = 1ull << 52,
|
||||
RADV_CMD_DIRTY_STREAMOUT_BUFFER = 1ull << 53,
|
||||
RADV_CMD_DIRTY_GUARDBAND = 1ull << 54,
|
||||
RADV_CMD_DIRTY_RBPLUS = 1ull << 55,
|
||||
RADV_CMD_DIRTY_NGG_QUERY = 1ull << 56,
|
||||
RADV_CMD_DIRTY_OCCLUSION_QUERY = 1ull << 57,
|
||||
RADV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS_ENABLE = 1ull << 49,
|
||||
RADV_CMD_DIRTY_DYNAMIC_ALL = (1ull << 50) - 1,
|
||||
RADV_CMD_DIRTY_PIPELINE = 1ull << 50,
|
||||
RADV_CMD_DIRTY_INDEX_BUFFER = 1ull << 51,
|
||||
RADV_CMD_DIRTY_FRAMEBUFFER = 1ull << 52,
|
||||
RADV_CMD_DIRTY_VERTEX_BUFFER = 1ull << 53,
|
||||
RADV_CMD_DIRTY_STREAMOUT_BUFFER = 1ull << 54,
|
||||
RADV_CMD_DIRTY_GUARDBAND = 1ull << 55,
|
||||
RADV_CMD_DIRTY_RBPLUS = 1ull << 56,
|
||||
RADV_CMD_DIRTY_NGG_QUERY = 1ull << 57,
|
||||
RADV_CMD_DIRTY_OCCLUSION_QUERY = 1ull << 58,
|
||||
};
|
||||
|
||||
enum radv_cmd_flush_bits {
|
||||
@@ -1581,7 +1583,6 @@ enum rgp_flush_bits {
|
||||
|
||||
struct radv_multisample_state {
|
||||
bool sample_shading_enable;
|
||||
bool uses_user_sample_locations;
|
||||
float min_sample_shading;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user