zink: use dynamic state for line-width
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Tue, 29 Oct 2019 11:43:56 +0000 (12:43 +0100)
committerErik Faye-Lund <erik.faye-lund@collabora.com>
Wed, 30 Oct 2019 10:29:23 +0000 (10:29 +0000)
This will lead to fewer pipelines in the cache, which is assumed to
become our most unavoidable performance bottle-neck down the line.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/zink/zink_context.c
src/gallium/drivers/zink/zink_context.h
src/gallium/drivers/zink/zink_pipeline.c
src/gallium/drivers/zink/zink_pipeline.h
src/gallium/drivers/zink/zink_state.c

index 10706b1a96a812524980be7211d4815740e9bcd2..c6f32f83aeca02e6e4fcd018a1c6d99a8c3cbb36 100644 (file)
@@ -1020,8 +1020,10 @@ zink_draw_vbo(struct pipe_context *pctx,
                                                &ctx->gfx_pipeline_state,
                                                dinfo->mode);
 
+   enum pipe_prim_type reduced_prim = u_reduced_prim(dinfo->mode);
+
    bool depth_bias = false;
-   switch (u_reduced_prim(dinfo->mode)) {
+   switch (reduced_prim) {
    case PIPE_PRIM_POINTS:
       depth_bias = rast_state->offset_point;
       break;
@@ -1154,6 +1156,13 @@ zink_draw_vbo(struct pipe_context *pctx,
       vkCmdSetScissor(batch->cmdbuf, 0, 1, &fb_scissor);
    }
 
+   if (reduced_prim == PIPE_PRIM_LINES) {
+      if (screen->feats.wideLines || ctx->line_width == 1.0f)
+         vkCmdSetLineWidth(batch->cmdbuf, ctx->line_width);
+      else
+         debug_printf("BUG: wide lines not supported, needs fallback!");
+   }
+
    vkCmdSetStencilReference(batch->cmdbuf, VK_STENCIL_FACE_FRONT_BIT, ctx->stencil_ref.ref_value[0]);
    vkCmdSetStencilReference(batch->cmdbuf, VK_STENCIL_FACE_BACK_BIT, ctx->stencil_ref.ref_value[1]);
 
index 173f076c0df4b602f31731578083538952b12d32..4abca476007ccd86379773678c795df8b410d4b0 100644 (file)
@@ -103,6 +103,7 @@ struct zink_context {
    struct pipe_sampler_view *image_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
    unsigned num_image_views[PIPE_SHADER_TYPES];
 
+   float line_width;
    float blend_constants[4];
 
    struct pipe_stencil_ref stencil_ref;
index b479673bf8725f5bd3d3a0a1527c0173e435b60f..261bdde5201a8141cfeba11edd52fa36a2c3d5af 100644 (file)
@@ -85,12 +85,7 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
    rast_state.depthBiasConstantFactor = 0.0;
    rast_state.depthBiasClamp = 0.0;
    rast_state.depthBiasSlopeFactor = 0.0;
-   if (screen->feats.wideLines)
-      rast_state.lineWidth = state->line_width;
-   else {
-      debug_printf("BUG: wide lines not supported, needs fallback!");
-      rast_state.lineWidth = 1.0f;
-   }
+   rast_state.lineWidth = 1.0f;
 
    VkPipelineDepthStencilStateCreateInfo depth_stencil_state = {};
    depth_stencil_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
@@ -105,11 +100,12 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
    depth_stencil_state.depthWriteEnable = state->depth_stencil_alpha_state->depth_write;
 
    VkDynamicState dynamicStateEnables[] = {
-      VK_DYNAMIC_STATE_DEPTH_BIAS,
-      VK_DYNAMIC_STATE_SCISSOR,
-      VK_DYNAMIC_STATE_STENCIL_REFERENCE,
       VK_DYNAMIC_STATE_VIEWPORT,
+      VK_DYNAMIC_STATE_SCISSOR,
+      VK_DYNAMIC_STATE_LINE_WIDTH,
+      VK_DYNAMIC_STATE_DEPTH_BIAS,
       VK_DYNAMIC_STATE_BLEND_CONSTANTS,
+      VK_DYNAMIC_STATE_STENCIL_REFERENCE,
    };
 
    VkPipelineDynamicStateCreateInfo pipelineDynamicStateCreateInfo = {};
index a7124c5b8b597503fb3286a7359b052c3c0e4f5b..d65bce21ffb232a07b4754de962a7ee9541e8975 100644 (file)
@@ -49,8 +49,6 @@ struct zink_gfx_pipeline_state {
 
    struct zink_depth_stencil_alpha_state *depth_stencil_alpha_state;
 
-   float line_width;
-
    VkSampleMask sample_mask;
    uint8_t rast_samples;
 };
index 340c725f9dce01c07c20eaab60925e473b42eeef..bec8d05d5854819c3e2da8fdd4ebbbfd5a441189 100644 (file)
@@ -424,7 +424,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
 
    if (ctx->rast_state) {
       ctx->gfx_pipeline_state.rast_state = &ctx->rast_state->hw_state;
-      ctx->gfx_pipeline_state.line_width = ctx->rast_state->line_width;
+      ctx->line_width = ctx->rast_state->line_width;
    }
 }