zink: rework missing feature warnings

the previous methodology triggered warnings any time a rasterizer state
was created with unsupported features without determining whether those
features would actually be used

a more optimal process is to check for missing features at pipeline creation,
as all the necessary info is now available, and spurious warnings can be avoided

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15778>
This commit is contained in:
Mike Blumenkrantz 2022-04-06 14:24:03 -04:00 committed by Marge Bot
parent da80beafb2
commit e96342c531
2 changed files with 61 additions and 62 deletions

View File

@ -242,12 +242,62 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
rast_line_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT;
rast_line_state.pNext = rast_state.pNext;
rast_line_state.stippledLineEnable = VK_FALSE;
rast_line_state.lineRasterizationMode = hw_rast_state->line_mode;
rast_line_state.lineRasterizationMode = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT;
bool check_warn = false;
switch (primitive_topology) {
case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
check_warn = true;
break;
default: break;
}
if (prog->nir[PIPE_SHADER_TESS_EVAL]) {
check_warn |= !prog->nir[PIPE_SHADER_TESS_EVAL]->info.tess.point_mode &&
prog->nir[PIPE_SHADER_TESS_EVAL]->info.tess._primitive_mode == TESS_PRIMITIVE_ISOLINES;
}
if (prog->nir[PIPE_SHADER_GEOMETRY]) {
switch (prog->nir[PIPE_SHADER_GEOMETRY]->info.gs.output_primitive) {
case SHADER_PRIM_LINES:
case SHADER_PRIM_LINE_LOOP:
case SHADER_PRIM_LINE_STRIP:
case SHADER_PRIM_LINES_ADJACENCY:
case SHADER_PRIM_LINE_STRIP_ADJACENCY:
check_warn = true;
break;
default: break;
}
}
if (check_warn) {
const char *features[4][2] = {
[VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT] = {"",""},
[VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT] = {"rectangularLines", "stippledRectangularLines"},
[VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT] = {"bresenhamLines", "stippledBresenhamLines"},
[VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT] = {"smoothLines", "stippledSmoothLines"},
};
static bool warned[6] = {0};
const VkPhysicalDeviceLineRasterizationFeaturesEXT *line_feats = &screen->info.line_rast_feats;
/* line features can be represented as an array VkBool32[6],
* with the 3 base features preceding the 3 (matching) stippled features
*/
const VkBool32 *feat = &line_feats->rectangularLines;
unsigned mode_idx = hw_rast_state->line_mode - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT;
/* add base mode index, add 3 if stippling is enabled */
mode_idx += hw_rast_state->line_stipple_enable * 3;
if (*(feat + mode_idx))
rast_line_state.lineRasterizationMode = hw_rast_state->line_mode;
else
warn_missing_feature(warned[mode_idx], features[hw_rast_state->line_mode][hw_rast_state->line_stipple_enable]);
}
if (hw_rast_state->line_stipple_enable) {
dynamicStateEnables[state_count++] = VK_DYNAMIC_STATE_LINE_STIPPLE_EXT;
rast_line_state.stippledLineEnable = VK_TRUE;
}
rast_state.pNext = &rast_line_state;
}
assert(state_count < ARRAY_SIZE(dynamicStateEnables));

View File

@ -561,18 +561,6 @@ line_width(float width, float granularity, const float range[2])
return CLAMP(width, range[0], range[1]);
}
#define warn_line_feature(feat) \
do { \
static bool warned = false; \
if (!warned) { \
fprintf(stderr, "WARNING: Incorrect rendering will happen, " \
"because the Vulkan device doesn't support " \
"the %s feature of " \
"VK_EXT_line_rasterization\n", feat); \
warned = true; \
} \
} while (0)
static void *
zink_create_rasterizer_state(struct pipe_context *pctx,
const struct pipe_rasterizer_state *rs_state)
@ -603,56 +591,17 @@ zink_create_rasterizer_state(struct pipe_context *pctx,
VK_FRONT_FACE_COUNTER_CLOCKWISE :
VK_FRONT_FACE_CLOCKWISE;
VkPhysicalDeviceLineRasterizationFeaturesEXT *line_feats =
&screen->info.line_rast_feats;
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT;
if (rs_state->line_stipple_enable) {
if (screen->info.have_EXT_line_rasterization) {
if (rs_state->line_rectangular) {
if (rs_state->line_smooth) {
if (line_feats->stippledSmoothLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT;
else
warn_line_feature("stippledSmoothLines");
} else if (line_feats->stippledRectangularLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT;
else
warn_line_feature("stippledRectangularLines");
} else if (line_feats->stippledBresenhamLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT;
else {
warn_line_feature("stippledBresenhamLines");
/* no suitable mode that supports line stippling */
state->base.line_stipple_factor = 0;
state->base.line_stipple_pattern = UINT16_MAX;
}
}
state->hw_state.line_mode = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT;
if (rs_state->line_rectangular) {
if (rs_state->line_smooth)
state->hw_state.line_mode = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT;
else
state->hw_state.line_mode = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT;
} else {
if (screen->info.have_EXT_line_rasterization) {
if (rs_state->line_rectangular) {
if (rs_state->line_smooth) {
if (line_feats->smoothLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT;
else
warn_line_feature("smoothLines");
} else if (line_feats->rectangularLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT;
else
warn_line_feature("rectangularLines");
} else if (line_feats->bresenhamLines)
state->hw_state.line_mode =
VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT;
else
warn_line_feature("bresenhamLines");
}
state->hw_state.line_mode = VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT;
}
if (!rs_state->line_stipple_enable) {
state->base.line_stipple_factor = 0;
state->base.line_stipple_pattern = UINT16_MAX;
}