diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 6ae6be594ab..dd099db85b0 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -480,6 +480,14 @@ zink_draw(struct pipe_context *pctx, lines_changed = (ctx->gfx_pipeline_state.rast_prim == PIPE_PRIM_LINES) != (rast_prim == PIPE_PRIM_LINES); + static bool rect_warned = false; + if (DYNAMIC_STATE >= ZINK_DYNAMIC_STATE3 && rast_prim == PIPE_PRIM_LINES && !rect_warned && + (VkLineRasterizationModeEXT)rast_state->hw_state.line_mode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT) { + if (screen->info.line_rast_feats.rectangularLines) + rect_warned = true; + else + warn_missing_feature(rect_warned, "rectangularLines"); + } ctx->gfx_pipeline_state.rast_prim = rast_prim; rast_prim_changed = true; @@ -632,7 +640,7 @@ zink_draw(struct pipe_context *pctx, VKCTX(CmdSetProvokingVertexModeEXT)(batch->state->cmdbuf, rast_state->hw_state.pv_last ? VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT : VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT); - VKCTX(CmdSetLineRasterizationModeEXT)(batch->state->cmdbuf, (VkLineRasterizationModeEXT)rast_state->hw_state.line_mode); + VKCTX(CmdSetLineRasterizationModeEXT)(batch->state->cmdbuf, rast_state->dynamic_line_mode); if (screen->info.dynamic_state3_feats.extendedDynamicState3LineStippleEnable) VKCTX(CmdSetLineStippleEnableEXT)(batch->state->cmdbuf, rast_state->hw_state.line_stipple_enable); } diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 17df1cd06b5..f7ae7e031e4 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -603,6 +603,22 @@ zink_create_rasterizer_state(struct pipe_context *pctx, } else { state->hw_state.line_mode = VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT; } + state->dynamic_line_mode = state->hw_state.line_mode; + switch (state->hw_state.line_mode) { + case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT: + if (!screen->info.line_rast_feats.rectangularLines) + state->dynamic_line_mode = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT; + break; + case VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT: + if (!screen->info.line_rast_feats.smoothLines) + state->dynamic_line_mode = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT; + break; + case VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT: + if (!screen->info.line_rast_feats.bresenhamLines) + state->dynamic_line_mode = VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT; + break; + default: break; + } if (!rs_state->line_stipple_enable) { state->base.line_stipple_factor = 1; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index cb3e6933662..2eabf2dbb97 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -310,6 +310,7 @@ struct zink_rasterizer_state { float line_width; VkFrontFace front_face; VkCullModeFlags cull_mode; + VkLineRasterizationModeEXT dynamic_line_mode; struct zink_rasterizer_hw_state hw_state; };