radeonsi: clean up passing the is_monolithic flag for compilation
[mesa.git] / src / gallium / drivers / radeonsi / si_state_shaders.c
index 74fe2c1ffc99f7f592f376acd688189514f63e52..f2569a53be3f9978a7e9073ed7417b2748aefc34 100644 (file)
@@ -605,6 +605,30 @@ static void si_shader_es(struct si_screen *sscreen, struct si_shader *shader)
        polaris_set_vgt_vertex_reuse(sscreen, shader->selector, shader, pm4);
 }
 
+static unsigned si_conv_prim_to_gs_out(unsigned mode)
+{
+       static const int prim_conv[] = {
+               [PIPE_PRIM_POINTS]                      = V_028A6C_OUTPRIM_TYPE_POINTLIST,
+               [PIPE_PRIM_LINES]                       = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               [PIPE_PRIM_LINE_LOOP]                   = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               [PIPE_PRIM_LINE_STRIP]                  = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               [PIPE_PRIM_TRIANGLES]                   = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_TRIANGLE_STRIP]              = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_TRIANGLE_FAN]                = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_QUADS]                       = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_QUAD_STRIP]                  = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_POLYGON]                     = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_LINES_ADJACENCY]             = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               [PIPE_PRIM_LINE_STRIP_ADJACENCY]        = V_028A6C_OUTPRIM_TYPE_LINESTRIP,
+               [PIPE_PRIM_TRIANGLES_ADJACENCY]         = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY]    = V_028A6C_OUTPRIM_TYPE_TRISTRIP,
+               [PIPE_PRIM_PATCHES]                     = V_028A6C_OUTPRIM_TYPE_POINTLIST,
+       };
+       assert(mode < ARRAY_SIZE(prim_conv));
+
+       return prim_conv[mode];
+}
+
 struct gfx9_gs_info {
        unsigned es_verts_per_subgroup;
        unsigned gs_prims_per_subgroup;
@@ -735,6 +759,8 @@ static void si_shader_gs(struct si_screen *sscreen, struct si_shader *shader)
        if (max_stream >= 2)
                offset += num_components[2] * sel->gs_max_out_vertices;
        si_pm4_set_reg(pm4, R_028A68_VGT_GSVS_RING_OFFSET_3, offset);
+       si_pm4_set_reg(pm4, R_028A6C_VGT_GS_OUT_PRIM_TYPE,
+                      si_conv_prim_to_gs_out(sel->gs_output_prim));
        if (max_stream >= 3)
                offset += num_components[3] * sel->gs_max_out_vertices;
        si_pm4_set_reg(pm4, R_028AB0_VGT_GSVS_RING_ITEMSIZE, offset);
@@ -1392,67 +1418,63 @@ static inline void si_shader_selector_key(struct pipe_context *ctx,
                        key->part.ps.epilog.color_is_int10 &= sel->info.colors_written;
                }
 
-               if (rs) {
-                       bool is_poly = (sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES &&
-                                       sctx->current_rast_prim <= PIPE_PRIM_POLYGON) ||
-                                      sctx->current_rast_prim >= PIPE_PRIM_TRIANGLES_ADJACENCY;
-                       bool is_line = !is_poly && sctx->current_rast_prim != PIPE_PRIM_POINTS;
+               bool is_poly = !util_prim_is_points_or_lines(sctx->current_rast_prim);
+               bool is_line = util_prim_is_lines(sctx->current_rast_prim);
 
-                       key->part.ps.prolog.color_two_side = rs->two_side && sel->info.colors_read;
-                       key->part.ps.prolog.flatshade_colors = rs->flatshade && sel->info.colors_read;
+               key->part.ps.prolog.color_two_side = rs->two_side && sel->info.colors_read;
+               key->part.ps.prolog.flatshade_colors = rs->flatshade && sel->info.colors_read;
 
-                       if (sctx->queued.named.blend) {
-                               key->part.ps.epilog.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
-                                                             rs->multisample_enable;
-                       }
+               if (sctx->queued.named.blend) {
+                       key->part.ps.epilog.alpha_to_one = sctx->queued.named.blend->alpha_to_one &&
+                                                          rs->multisample_enable;
+               }
 
-                       key->part.ps.prolog.poly_stipple = rs->poly_stipple_enable && is_poly;
-                       key->part.ps.epilog.poly_line_smoothing = ((is_poly && rs->poly_smooth) ||
-                                                             (is_line && rs->line_smooth)) &&
-                                                            sctx->framebuffer.nr_samples <= 1;
-                       key->part.ps.epilog.clamp_color = rs->clamp_fragment_color;
+               key->part.ps.prolog.poly_stipple = rs->poly_stipple_enable && is_poly;
+               key->part.ps.epilog.poly_line_smoothing = ((is_poly && rs->poly_smooth) ||
+                                                          (is_line && rs->line_smooth)) &&
+                                                         sctx->framebuffer.nr_samples <= 1;
+               key->part.ps.epilog.clamp_color = rs->clamp_fragment_color;
 
-                       if (sctx->ps_iter_samples > 1 &&
-                           sel->info.reads_samplemask) {
-                               key->part.ps.prolog.samplemask_log_ps_iter =
-                                       util_logbase2(sctx->ps_iter_samples);
-                       }
+               if (sctx->ps_iter_samples > 1 &&
+                   sel->info.reads_samplemask) {
+                       key->part.ps.prolog.samplemask_log_ps_iter =
+                               util_logbase2(sctx->ps_iter_samples);
+               }
 
-                       if (rs->force_persample_interp &&
-                           rs->multisample_enable &&
-                           sctx->framebuffer.nr_samples > 1 &&
-                           sctx->ps_iter_samples > 1) {
-                               key->part.ps.prolog.force_persp_sample_interp =
-                                       sel->info.uses_persp_center ||
-                                       sel->info.uses_persp_centroid;
-
-                               key->part.ps.prolog.force_linear_sample_interp =
-                                       sel->info.uses_linear_center ||
-                                       sel->info.uses_linear_centroid;
-                       } else if (rs->multisample_enable &&
-                                  sctx->framebuffer.nr_samples > 1) {
-                               key->part.ps.prolog.bc_optimize_for_persp =
-                                       sel->info.uses_persp_center &&
-                                       sel->info.uses_persp_centroid;
-                               key->part.ps.prolog.bc_optimize_for_linear =
-                                       sel->info.uses_linear_center &&
-                                       sel->info.uses_linear_centroid;
-                       } else {
-                               /* Make sure SPI doesn't compute more than 1 pair
-                                * of (i,j), which is the optimization here. */
-                               key->part.ps.prolog.force_persp_center_interp =
-                                       sel->info.uses_persp_center +
-                                       sel->info.uses_persp_centroid +
-                                       sel->info.uses_persp_sample > 1;
-
-                               key->part.ps.prolog.force_linear_center_interp =
-                                       sel->info.uses_linear_center +
-                                       sel->info.uses_linear_centroid +
-                                       sel->info.uses_linear_sample > 1;
-
-                               if (sel->info.opcode_count[TGSI_OPCODE_INTERP_SAMPLE])
-                                       key->mono.u.ps.interpolate_at_sample_force_center = 1;
-                       }
+               if (rs->force_persample_interp &&
+                   rs->multisample_enable &&
+                   sctx->framebuffer.nr_samples > 1 &&
+                   sctx->ps_iter_samples > 1) {
+                       key->part.ps.prolog.force_persp_sample_interp =
+                               sel->info.uses_persp_center ||
+                               sel->info.uses_persp_centroid;
+
+                       key->part.ps.prolog.force_linear_sample_interp =
+                               sel->info.uses_linear_center ||
+                               sel->info.uses_linear_centroid;
+               } else if (rs->multisample_enable &&
+                          sctx->framebuffer.nr_samples > 1) {
+                       key->part.ps.prolog.bc_optimize_for_persp =
+                               sel->info.uses_persp_center &&
+                               sel->info.uses_persp_centroid;
+                       key->part.ps.prolog.bc_optimize_for_linear =
+                               sel->info.uses_linear_center &&
+                               sel->info.uses_linear_centroid;
+               } else {
+                       /* Make sure SPI doesn't compute more than 1 pair
+                        * of (i,j), which is the optimization here. */
+                       key->part.ps.prolog.force_persp_center_interp =
+                               sel->info.uses_persp_center +
+                               sel->info.uses_persp_centroid +
+                               sel->info.uses_persp_sample > 1;
+
+                       key->part.ps.prolog.force_linear_center_interp =
+                               sel->info.uses_linear_center +
+                               sel->info.uses_linear_centroid +
+                               sel->info.uses_linear_sample > 1;
+
+                       if (sel->info.opcode_count[TGSI_OPCODE_INTERP_SAMPLE])
+                               key->mono.u.ps.interpolate_at_sample_force_center = 1;
                }
 
                key->part.ps.epilog.alpha_func = si_get_alpha_test_func(sctx);
@@ -1560,10 +1582,10 @@ static bool si_check_missing_main_part(struct si_screen *sscreen,
                main_part->selector = sel;
                main_part->key.as_es = key->as_es;
                main_part->key.as_ls = key->as_ls;
+               main_part->is_monolithic = false;
 
                if (si_compile_tgsi_shader(sscreen, compiler_state->compiler,
-                                          main_part, false,
-                                          &compiler_state->debug) != 0) {
+                                          main_part, &compiler_state->debug) != 0) {
                        FREE(main_part);
                        return false;
                }
@@ -1862,6 +1884,7 @@ static void si_init_shader_selector_async(void *job, int thread_index)
                util_queue_fence_init(&shader->ready);
 
                shader->selector = sel;
+               shader->is_monolithic = false;
                si_parse_next_shader_property(&sel->info,
                                              sel->so.num_outputs != 0,
                                              &shader->key);
@@ -1880,7 +1903,7 @@ static void si_init_shader_selector_async(void *job, int thread_index)
                        mtx_unlock(&sscreen->shader_cache_mutex);
 
                        /* Compile the shader if it hasn't been loaded from the cache. */
-                       if (si_compile_tgsi_shader(sscreen, compiler, shader, false,
+                       if (si_compile_tgsi_shader(sscreen, compiler, shader,
                                                   debug) != 0) {
                                FREE(shader);
                                FREE(ir_binary);
@@ -2604,7 +2627,7 @@ static unsigned si_get_ps_input_cntl(struct si_context *sctx,
 
 static void si_emit_spi_map(struct si_context *sctx)
 {
-       struct radeon_winsys_cs *cs = sctx->gfx_cs;
+       struct radeon_cmdbuf *cs = sctx->gfx_cs;
        struct si_shader *ps = sctx->ps_shader.current;
        struct si_shader *vs = si_get_vs_state(sctx);
        struct tgsi_shader_info *psinfo = ps ? &ps->selector->info : NULL;
@@ -3334,7 +3357,7 @@ bool si_update_shaders(struct si_context *sctx)
 
 static void si_emit_scratch_state(struct si_context *sctx)
 {
-       struct radeon_winsys_cs *cs = sctx->gfx_cs;
+       struct radeon_cmdbuf *cs = sctx->gfx_cs;
 
        radeon_set_context_reg(cs, R_0286E8_SPI_TMPRING_SIZE,
                               sctx->spi_tmpring_size);