st/mesa: remove unused st_xxx_program::sha1
[mesa.git] / src / mesa / state_tracker / st_program.c
index f1d3f7b3ce70e1d2acdb932d1baaa2bf5aafedfc..b06aa7fc0653818478a2a1665b54517f13ba4746 100644 (file)
@@ -244,7 +244,7 @@ delete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
    if (vpv->draw_shader)
       draw_delete_vertex_shader( st->draw, vpv->draw_shader );
 
-   delete_ir(&vpv->tgsi);
+   delete_ir(&vpv->state);
 
    free( vpv );
 }
@@ -268,7 +268,7 @@ st_release_vp_variants( struct st_context *st,
 
    stvp->variants = NULL;
 
-   delete_ir(&stvp->tgsi);
+   delete_ir(&stvp->state);
 }
 
 
@@ -309,7 +309,7 @@ st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
 
    stfp->variants = NULL;
 
-   delete_ir(&stfp->tgsi);
+   delete_ir(&stfp->state);
 }
 
 
@@ -318,7 +318,7 @@ st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
  * the variant from the linked list.
  */
 static void
-delete_basic_variant(struct st_context *st, struct st_basic_variant *v,
+delete_basic_variant(struct st_context *st, struct st_common_variant *v,
                      GLenum target)
 {
    if (v->driver_shader) {
@@ -372,18 +372,18 @@ delete_basic_variant(struct st_context *st, struct st_basic_variant *v,
  * Free all basic program variants.
  */
 void
-st_release_basic_variants(struct st_context *st, struct st_common_program *p)
+st_release_common_variants(struct st_context *st, struct st_common_program *p)
 {
-   struct st_basic_variant *v;
+   struct st_common_variant *v;
 
    for (v = p->variants; v; ) {
-      struct st_basic_variant *next = v->next;
+      struct st_common_variant *next = v->next;
       delete_basic_variant(st, v, p->Base.Target);
       v = next;
    }
 
    p->variants = NULL;
-   delete_ir(&p->tgsi);
+   delete_ir(&p->state);
 }
 
 
@@ -470,9 +470,9 @@ st_translate_stream_output_info(struct gl_program *prog)
    /* Translate stream output info. */
    struct pipe_stream_output_info *so_info = NULL;
    if (prog->info.stage == MESA_SHADER_VERTEX)
-      so_info = &((struct st_vertex_program*)prog)->tgsi.stream_output;
+      so_info = &((struct st_vertex_program*)prog)->state.stream_output;
    else
-      so_info = &((struct st_common_program*)prog)->tgsi.stream_output;
+      so_info = &((struct st_common_program*)prog)->state.stream_output;
 
    for (unsigned i = 0; i < info->NumOutputs; i++) {
       so_info->output[i].register_index =
@@ -604,7 +604,7 @@ st_translate_vertex_program(struct st_context *st,
       return false;
    }
 
-   stvp->tgsi.tokens = ureg_get_tokens(ureg, &stvp->num_tgsi_tokens);
+   stvp->state.tokens = ureg_get_tokens(ureg, NULL);
    ureg_destroy(ureg);
 
    if (stvp->glsl_to_tgsi) {
@@ -626,15 +626,15 @@ st_translate_vertex_program(struct st_context *st,
       nir_shader *nir =
          st_translate_prog_to_nir(st, &stvp->Base, MESA_SHADER_VERTEX);
 
-      if (stvp->tgsi.ir.nir)
-         ralloc_free(stvp->tgsi.ir.nir);
-      stvp->tgsi.type = PIPE_SHADER_IR_NIR;
-      stvp->tgsi.ir.nir = nir;
+      if (stvp->state.ir.nir)
+         ralloc_free(stvp->state.ir.nir);
+      stvp->state.type = PIPE_SHADER_IR_NIR;
+      stvp->state.ir.nir = nir;
       stvp->Base.nir = nir;
       return true;
    }
 
-   return stvp->tgsi.tokens != NULL;
+   return stvp->state.tokens != NULL;
 }
 
 static const gl_state_index16 depth_range_state[STATE_LENGTH] =
@@ -643,14 +643,17 @@ static const gl_state_index16 depth_range_state[STATE_LENGTH] =
 static struct st_vp_variant *
 st_create_vp_variant(struct st_context *st,
                      struct st_vertex_program *stvp,
-                     const struct st_vp_variant_key *key)
+                     const struct st_common_variant_key *key)
 {
    struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
    struct pipe_context *pipe = st->pipe;
+
+   static const gl_state_index16 point_size_state[STATE_LENGTH] =
+      { STATE_INTERNAL, STATE_POINT_SIZE_CLAMPED, 0 };
    struct gl_program_parameter_list *params = stvp->Base.Parameters;
 
    vpv->key = *key;
-   vpv->tgsi.stream_output = stvp->tgsi.stream_output;
+   vpv->state.stream_output = stvp->state.stream_output;
    vpv->num_inputs = stvp->num_inputs;
 
    /* When generating a NIR program, we usually don't have TGSI tokens.
@@ -658,25 +661,56 @@ st_create_vp_variant(struct st_context *st,
     * programs which we may need to use with the draw module for legacy
     * feedback/select emulation.  If they exist, copy them.
     */
-   if (stvp->tgsi.tokens)
-      vpv->tgsi.tokens = tgsi_dup_tokens(stvp->tgsi.tokens);
+   if (stvp->state.tokens)
+      vpv->state.tokens = tgsi_dup_tokens(stvp->state.tokens);
 
-   if (stvp->tgsi.type == PIPE_SHADER_IR_NIR) {
-      vpv->tgsi.type = PIPE_SHADER_IR_NIR;
-      vpv->tgsi.ir.nir = nir_shader_clone(NULL, stvp->tgsi.ir.nir);
+   if (stvp->state.type == PIPE_SHADER_IR_NIR) {
+      vpv->state.type = PIPE_SHADER_IR_NIR;
+      vpv->state.ir.nir = nir_shader_clone(NULL, stvp->state.ir.nir);
       if (key->clamp_color)
-         NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_clamp_color_outputs);
+         NIR_PASS_V(vpv->state.ir.nir, nir_lower_clamp_color_outputs);
       if (key->passthrough_edgeflags) {
-         NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_passthrough_edgeflags);
+         NIR_PASS_V(vpv->state.ir.nir, nir_lower_passthrough_edgeflags);
          vpv->num_inputs++;
       }
 
+      if (key->lower_point_size) {
+         _mesa_add_state_reference(params, point_size_state);
+         NIR_PASS_V(vpv->state.ir.nir, nir_lower_point_size_mov,
+                    point_size_state);
+      }
+
+      if (key->lower_ucp) {
+         struct pipe_screen *screen = pipe->screen;
+         bool can_compact = screen->get_param(screen,
+                                              PIPE_CAP_NIR_COMPACT_ARRAYS);
+
+         bool use_eye = st->ctx->_Shader->CurrentProgram[MESA_SHADER_VERTEX] != NULL;
+         gl_state_index16 clipplane_state[MAX_CLIP_PLANES][STATE_LENGTH];
+         for (int i = 0; i < MAX_CLIP_PLANES; ++i) {
+            if (use_eye) {
+               clipplane_state[i][0] = STATE_CLIPPLANE;
+               clipplane_state[i][1] = i;
+            } else {
+               clipplane_state[i][0] = STATE_INTERNAL;
+               clipplane_state[i][1] = STATE_CLIP_INTERNAL;
+               clipplane_state[i][2] = i;
+            }
+            _mesa_add_state_reference(params, clipplane_state[i]);
+         }
+
+         NIR_PASS_V(vpv->state.ir.nir, nir_lower_clip_vs, key->lower_ucp,
+                    true, can_compact, clipplane_state);
+         NIR_PASS_V(vpv->state.ir.nir, nir_lower_io_to_temporaries,
+                    nir_shader_get_entrypoint(vpv->state.ir.nir), true, false);
+      }
+
       st_finalize_nir(st, &stvp->Base, stvp->shader_program,
-                      vpv->tgsi.ir.nir);
+                      vpv->state.ir.nir);
 
-      vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
+      vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->state);
       /* driver takes ownership of IR: */
-      vpv->tgsi.ir.nir = NULL;
+      vpv->state.ir.nir = NULL;
       return vpv;
    }
 
@@ -687,11 +721,11 @@ st_create_vp_variant(struct st_context *st,
          (key->clamp_color ? TGSI_EMU_CLAMP_COLOR_OUTPUTS : 0) |
          (key->passthrough_edgeflags ? TGSI_EMU_PASSTHROUGH_EDGEFLAG : 0);
 
-      tokens = tgsi_emulate(vpv->tgsi.tokens, flags);
+      tokens = tgsi_emulate(vpv->state.tokens, flags);
 
       if (tokens) {
-         tgsi_free_tokens(vpv->tgsi.tokens);
-         vpv->tgsi.tokens = tokens;
+         tgsi_free_tokens(vpv->state.tokens);
+         vpv->state.tokens = tokens;
 
          if (key->passthrough_edgeflags)
             vpv->num_inputs++;
@@ -704,19 +738,19 @@ st_create_vp_variant(struct st_context *st,
             _mesa_add_state_reference(params, depth_range_state);
 
       const struct tgsi_token *tokens;
-      tokens = st_tgsi_lower_depth_clamp(vpv->tgsi.tokens, depth_range_const,
+      tokens = st_tgsi_lower_depth_clamp(vpv->state.tokens, depth_range_const,
                                          key->clip_negative_one_to_one);
-      if (tokens != vpv->tgsi.tokens)
-         tgsi_free_tokens(vpv->tgsi.tokens);
-      vpv->tgsi.tokens = tokens;
+      if (tokens != vpv->state.tokens)
+         tgsi_free_tokens(vpv->state.tokens);
+      vpv->state.tokens = tokens;
    }
 
    if (ST_DEBUG & DEBUG_TGSI) {
-      tgsi_dump(vpv->tgsi.tokens, 0);
+      tgsi_dump(vpv->state.tokens, 0);
       debug_printf("\n");
    }
 
-   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
+   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->state);
    return vpv;
 }
 
@@ -727,7 +761,7 @@ st_create_vp_variant(struct st_context *st,
 struct st_vp_variant *
 st_get_vp_variant(struct st_context *st,
                   struct st_vertex_program *stvp,
-                  const struct st_vp_variant_key *key)
+                  const struct st_common_variant_key *key)
 {
    struct st_vp_variant *vpv;
 
@@ -800,10 +834,10 @@ st_translate_fragment_program(struct st_context *st,
          nir_shader *nir =
             st_translate_prog_to_nir(st, &stfp->Base, MESA_SHADER_FRAGMENT);
 
-         if (stfp->tgsi.ir.nir)
-            ralloc_free(stfp->tgsi.ir.nir);
-         stfp->tgsi.type = PIPE_SHADER_IR_NIR;
-         stfp->tgsi.ir.nir = nir;
+         if (stfp->state.ir.nir)
+            ralloc_free(stfp->state.ir.nir);
+         stfp->state.type = PIPE_SHADER_IR_NIR;
+         stfp->state.ir.nir = nir;
          stfp->Base.nir = nir;
          return true;
       }
@@ -1124,7 +1158,7 @@ st_translate_fragment_program(struct st_context *st,
                                 fs_output_semantic_name,
                                 fs_output_semantic_index);
 
-   stfp->tgsi.tokens = ureg_get_tokens(ureg, &stfp->num_tgsi_tokens);
+   stfp->state.tokens = ureg_get_tokens(ureg, NULL);
    ureg_destroy(ureg);
 
    if (stfp->glsl_to_tgsi) {
@@ -1132,7 +1166,7 @@ st_translate_fragment_program(struct st_context *st,
       st_store_ir_in_disk_cache(st, &stfp->Base, false);
    }
 
-   return stfp->tgsi.tokens != NULL;
+   return stfp->state.tokens != NULL;
 }
 
 static struct st_fp_variant *
@@ -1156,9 +1190,9 @@ st_create_fp_variant(struct st_context *st,
    if (!variant)
       return NULL;
 
-   if (stfp->tgsi.type == PIPE_SHADER_IR_NIR) {
+   if (stfp->state.type == PIPE_SHADER_IR_NIR) {
       tgsi.type = PIPE_SHADER_IR_NIR;
-      tgsi.ir.nir = nir_shader_clone(NULL, stfp->tgsi.ir.nir);
+      tgsi.ir.nir = nir_shader_clone(NULL, stfp->state.ir.nir);
 
       if (key->clamp_color)
          NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
@@ -1172,6 +1206,9 @@ st_create_fp_variant(struct st_context *st,
                     false, alpha_ref_state);
       }
 
+      if (key->lower_two_sided_color)
+         NIR_PASS_V(tgsi.ir.nir, nir_lower_two_sided_color);
+
       if (key->persample_shading) {
           nir_shader *shader = tgsi.ir.nir;
           nir_foreach_variable(var, &shader->inputs)
@@ -1259,7 +1296,7 @@ st_create_fp_variant(struct st_context *st,
       return variant;
    }
 
-   tgsi.tokens = stfp->tgsi.tokens;
+   tgsi.tokens = stfp->state.tokens;
 
    assert(!(key->bitmap && key->drawpixels));
 
@@ -1283,7 +1320,7 @@ st_create_fp_variant(struct st_context *st,
       tokens = tgsi_emulate(tgsi.tokens, flags);
 
       if (tokens) {
-         if (tgsi.tokens != stfp->tgsi.tokens)
+         if (tgsi.tokens != stfp->state.tokens)
             tgsi_free_tokens(tgsi.tokens);
          tgsi.tokens = tokens;
       } else
@@ -1304,7 +1341,7 @@ st_create_fp_variant(struct st_context *st,
                                     PIPE_FORMAT_R8_UNORM);
 
       if (tokens) {
-         if (tgsi.tokens != stfp->tgsi.tokens)
+         if (tgsi.tokens != stfp->state.tokens)
             tgsi_free_tokens(tgsi.tokens);
          tgsi.tokens = tokens;
       } else
@@ -1342,7 +1379,7 @@ st_create_fp_variant(struct st_context *st,
                                      texcoord_const, st->internal_target);
 
       if (tokens) {
-         if (tgsi.tokens != stfp->tgsi.tokens)
+         if (tgsi.tokens != stfp->state.tokens)
             tgsi_free_tokens(tgsi.tokens);
          tgsi.tokens = tokens;
       } else
@@ -1363,7 +1400,7 @@ st_create_fp_variant(struct st_context *st,
                                     key->external.lower_yx_xuxv,
                                  key->external.lower_iyuv);
       if (tokens) {
-         if (tgsi.tokens != stfp->tgsi.tokens)
+         if (tgsi.tokens != stfp->state.tokens)
             tgsi_free_tokens(tgsi.tokens);
          tgsi.tokens = tokens;
       } else {
@@ -1376,7 +1413,7 @@ st_create_fp_variant(struct st_context *st,
 
       const struct tgsi_token *tokens;
       tokens = st_tgsi_lower_depth_clamp_fs(tgsi.tokens, depth_range_const);
-      if (tgsi.tokens != stfp->tgsi.tokens)
+      if (tgsi.tokens != stfp->state.tokens)
          tgsi_free_tokens(tgsi.tokens);
       tgsi.tokens = tokens;
    }
@@ -1390,7 +1427,7 @@ st_create_fp_variant(struct st_context *st,
    variant->driver_shader = pipe->create_fs_state(pipe, &tgsi);
    variant->key = *key;
 
-   if (tgsi.tokens != stfp->tgsi.tokens)
+   if (tgsi.tokens != stfp->state.tokens)
       tgsi_free_tokens(tgsi.tokens);
    return variant;
 }
@@ -1518,7 +1555,7 @@ st_translate_common_program(struct st_context *st,
    memset(inputSlotToAttr, 0, sizeof(inputSlotToAttr));
    memset(inputMapping, 0, sizeof(inputMapping));
    memset(outputMapping, 0, sizeof(outputMapping));
-   memset(&stcp->tgsi, 0, sizeof(stcp->tgsi));
+   memset(&stcp->state, 0, sizeof(stcp->state));
 
    if (prog->info.clip_distance_array_size)
       ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED,
@@ -1613,7 +1650,7 @@ st_translate_common_program(struct st_context *st,
                         output_semantic_name,
                         output_semantic_index);
 
-   stcp->tgsi.tokens = ureg_get_tokens(ureg, &stcp->num_tgsi_tokens);
+   stcp->state.tokens = ureg_get_tokens(ureg, NULL);
 
    ureg_destroy(ureg);
 
@@ -1627,7 +1664,7 @@ st_translate_common_program(struct st_context *st,
    }
 
    if (ST_DEBUG & DEBUG_TGSI) {
-      tgsi_dump(stcp->tgsi.tokens, 0);
+      tgsi_dump(stcp->state.tokens, 0);
       debug_printf("\n");
    }
 
@@ -1640,13 +1677,13 @@ st_translate_common_program(struct st_context *st,
 /**
  * Get/create a basic program variant.
  */
-struct st_basic_variant *
-st_get_basic_variant(struct st_context *st,
-                     struct st_common_program *prog,
-                     const struct st_basic_variant_key *key)
+struct st_common_variant *
+st_get_common_variant(struct st_context *st,
+                      struct st_common_program *prog,
+                      const struct st_common_variant_key *key)
 {
    struct pipe_context *pipe = st->pipe;
-   struct st_basic_variant *v;
+   struct st_common_variant *v;
    struct pipe_shader_state tgsi = {0};
 
    /* Search for existing variant */
@@ -1658,17 +1695,17 @@ st_get_basic_variant(struct st_context *st,
 
    if (!v) {
       /* create new */
-      v = CALLOC_STRUCT(st_basic_variant);
+      v = CALLOC_STRUCT(st_common_variant);
       if (v) {
 
-        if (prog->tgsi.type == PIPE_SHADER_IR_NIR) {
+        if (prog->state.type == PIPE_SHADER_IR_NIR) {
            tgsi.type = PIPE_SHADER_IR_NIR;
-           tgsi.ir.nir = nir_shader_clone(NULL, prog->tgsi.ir.nir);
+           tgsi.ir.nir = nir_shader_clone(NULL, prog->state.ir.nir);
 
             if (key->clamp_color)
                NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs);
 
-            tgsi.stream_output = prog->tgsi.stream_output;
+            tgsi.stream_output = prog->state.stream_output;
 
             st_finalize_nir(st, &prog->Base, prog->shader_program,
                             tgsi.ir.nir);
@@ -1681,17 +1718,16 @@ st_get_basic_variant(struct st_context *st,
 
                const struct tgsi_token *tokens;
                tokens =
-                     st_tgsi_lower_depth_clamp(prog->tgsi.tokens,
+                     st_tgsi_lower_depth_clamp(prog->state.tokens,
                                                depth_range_const,
                                                key->clip_negative_one_to_one);
 
-               if (tokens != prog->tgsi.tokens)
-                  tgsi_free_tokens(prog->tgsi.tokens);
+               if (tokens != prog->state.tokens)
+                  tgsi_free_tokens(prog->state.tokens);
 
-               prog->tgsi.tokens = tokens;
-               prog->num_tgsi_tokens = tgsi_num_tokens(tokens);
+               prog->state.tokens = tokens;
             }
-           tgsi = prog->tgsi;
+           tgsi = prog->state;
          }
          /* fill in new variant */
          switch (prog->Base.info.stage) {
@@ -1793,10 +1829,10 @@ destroy_program_variants(struct st_context *st, struct gl_program *target)
    case GL_COMPUTE_PROGRAM_NV:
       {
          struct st_common_program *p = st_common_program(target);
-         struct st_basic_variant *v, **prevPtr = &p->variants;
+         struct st_common_variant *v, **prevPtr = &p->variants;
 
          for (v = p->variants; v; ) {
-            struct st_basic_variant *next = v->next;
+            struct st_common_variant *next = v->next;
             if (v->key.st == st) {
                /* unlink from list */
                *prevPtr = next;
@@ -1906,7 +1942,7 @@ st_print_current_vertex_program(void)
 
       for (stv = stvp->variants; stv; stv = stv->next) {
          debug_printf("variant %p\n", stv);
-         tgsi_dump(stv->tgsi.tokens, 0);
+         tgsi_dump(stv->state.tokens, 0);
       }
    }
 }
@@ -1922,7 +1958,7 @@ st_precompile_shader_variant(struct st_context *st,
    switch (prog->Target) {
    case GL_VERTEX_PROGRAM_ARB: {
       struct st_vertex_program *p = (struct st_vertex_program *)prog;
-      struct st_vp_variant_key key;
+      struct st_common_variant_key key;
 
       memset(&key, 0, sizeof(key));
 
@@ -1947,12 +1983,12 @@ st_precompile_shader_variant(struct st_context *st,
    case GL_GEOMETRY_PROGRAM_NV:
    case GL_COMPUTE_PROGRAM_NV: {
       struct st_common_program *p = st_common_program(prog);
-      struct st_basic_variant_key key;
+      struct st_common_variant_key key;
 
       memset(&key, 0, sizeof(key));
 
       key.st = st->has_shareable_shaders ? NULL : st;
-      st_get_basic_variant(st, p, &key);
+      st_get_common_variant(st, p, &key);
       break;
    }