svga: add need_texcoord_semantic to tgsi_add_point_sprite & tgsi_add_aa_point
authorCharmaine Lee <charmainel@vmware.com>
Wed, 18 May 2022 00:20:53 +0000 (17:20 -0700)
committerMarge Bot <emma+marge@anholt.net>
Thu, 19 May 2022 17:17:12 +0000 (17:17 +0000)
Since PIPE_CAP_TGSI_TEXCOORD is now set in SVGA vgpu10 driver,
we need to add a new parameter need_texcoord_semantic to
tgsi_add_point_sprite and tgsi_add_aa_point
to allow setting texcoords using tgsi texcoord semantic.

Reviewed-by: Neha Bhende <bhenden@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16598>

src/gallium/auxiliary/tgsi/tgsi_aa_point.c
src/gallium/auxiliary/tgsi/tgsi_aa_point.h
src/gallium/auxiliary/tgsi/tgsi_point_sprite.c
src/gallium/auxiliary/tgsi/tgsi_point_sprite.h
src/gallium/drivers/svga/svga_link.c
src/gallium/drivers/svga/svga_state_tgsi_transform.c
src/gallium/drivers/svga/svga_tgsi_vgpu10.c

index 58f610f..ace4d9a 100644 (file)
@@ -47,6 +47,7 @@ struct aa_transform_context
    unsigned num_imm;       // number of immediates
    unsigned num_input;     // number of inputs
    unsigned aa_point_coord_index;
+   bool need_texcoord_semantic;
 };
 
 static inline struct aa_transform_context *
@@ -113,8 +114,15 @@ aa_prolog(struct tgsi_transform_context *ctx)
 
    /* Declare new generic input/texcoord */
    texIn = ts->num_input++;
-   tgsi_transform_input_decl(ctx, texIn, TGSI_SEMANTIC_GENERIC,
-                             ts->aa_point_coord_index, TGSI_INTERPOLATE_LINEAR);
+   if (ts->need_texcoord_semantic) {
+      tgsi_transform_input_decl(ctx, texIn, TGSI_SEMANTIC_TEXCOORD,
+                                ts->aa_point_coord_index,
+                                TGSI_INTERPOLATE_LINEAR);
+   } else {
+      tgsi_transform_input_decl(ctx, texIn, TGSI_SEMANTIC_GENERIC,
+                                ts->aa_point_coord_index,
+                                TGSI_INTERPOLATE_LINEAR);
+   }
 
    /* Declare extra immediates */
    imm = ts->num_imm++;
@@ -271,7 +279,8 @@ aa_epilog(struct tgsi_transform_context *ctx)
  */
 struct tgsi_token *
 tgsi_add_aa_point(const struct tgsi_token *tokens_in,
-                  const int aa_point_coord_index)
+                  const int aa_point_coord_index,
+                  const bool need_texcoord_semantic)
 {
    struct aa_transform_context transform;
    const uint num_new_tokens = 200; /* should be enough */
@@ -291,6 +300,7 @@ tgsi_add_aa_point(const struct tgsi_token *tokens_in,
 
    assert(aa_point_coord_index != -1);
    transform.aa_point_coord_index = (unsigned)aa_point_coord_index;
+   transform.need_texcoord_semantic = need_texcoord_semantic;
 
    transform.num_tmp = 0;
    transform.num_imm = 0;
index d89f40c..160bc03 100644 (file)
@@ -30,6 +30,7 @@ struct tgsi_token;
 
 struct tgsi_token *
 tgsi_add_aa_point(const struct tgsi_token *tokens_in,
-                  const int aa_point_coord_index);
+                  const int aa_point_coord_index,
+                  const bool need_texcoord_semantic);
 
 #endif /* TGSI_AA_POINT_H */
index 432a137..eb17a1b 100644 (file)
@@ -95,6 +95,7 @@ struct psprite_transform_context
    unsigned point_coord_k;          // aa point coord threshold distance
    unsigned stream_out_point_pos:1; // set if to stream out original point pos
    unsigned aa_point:1;             // set if doing aa point
+   unsigned need_texcoord_semantic:1;   // set if need texcoord semantic
    unsigned out_tmp_index[PIPE_MAX_SHADER_OUTPUTS];
    int max_generic;                 // max generic semantic index
 };
@@ -131,11 +132,16 @@ psprite_decl(struct tgsi_transform_context *ctx,
       else if (decl->Semantic.Name == TGSI_SEMANTIC_POSITION) {
          ts->point_pos_out = decl->Range.First;
       }
-      else if (decl->Semantic.Name == TGSI_SEMANTIC_GENERIC &&
+      else if (!ts->need_texcoord_semantic &&
+              decl->Semantic.Name == TGSI_SEMANTIC_GENERIC &&
                decl->Semantic.Index < 32) {
          ts->point_coord_decl |= 1 << decl->Semantic.Index;
          ts->max_generic = MAX2(ts->max_generic, (int)decl->Semantic.Index);
       }
+      else if (ts->need_texcoord_semantic &&
+               decl->Semantic.Name == TGSI_SEMANTIC_TEXCOORD) {
+         ts->point_coord_decl |= 1 << decl->Semantic.Index;
+      }
       ts->num_out = MAX2(ts->num_out, range_end);
    }
    else if (decl->Declaration.File == TGSI_FILE_TEMPORARY) {
@@ -213,22 +219,35 @@ psprite_prolog(struct tgsi_transform_context *ctx)
     */
    ts->point_coord_out = ts->num_out;
    if (point_coord_enable) {
-      for (i = 0, en = point_coord_enable; en; en>>=1, i++) {
-         if (en & 0x1) {
-            tgsi_transform_output_decl(ctx, ts->num_out++,
-                                       TGSI_SEMANTIC_GENERIC, i, 0);
-            ts->max_generic = MAX2(ts->max_generic, (int)i);
+      if (ts->need_texcoord_semantic) {
+         for (i = 0, en = point_coord_enable; en; en>>=1, i++) {
+            if (en & 0x1) {
+               tgsi_transform_output_decl(ctx, ts->num_out++,
+                                          TGSI_SEMANTIC_TEXCOORD, i, 0);
+            }
+         }
+      } else {
+         for (i = 0, en = point_coord_enable; en; en>>=1, i++) {
+            if (en & 0x1) {
+               tgsi_transform_output_decl(ctx, ts->num_out++,
+                                          TGSI_SEMANTIC_GENERIC, i, 0);
+               ts->max_generic = MAX2(ts->max_generic, (int)i);
+            }
          }
       }
    }
 
    /* add an extra generic output for aa point texcoord */
    if (ts->aa_point) {
-      ts->point_coord_aa = ts->max_generic + 1;
-      assert((ts->point_coord_enable & (1 << ts->point_coord_aa)) == 0);
-      ts->point_coord_enable |= 1 << (ts->point_coord_aa);
-      tgsi_transform_output_decl(ctx, ts->num_out++, TGSI_SEMANTIC_GENERIC,
-                                 ts->point_coord_aa, 0);
+      if (ts->need_texcoord_semantic) {
+         ts->point_coord_aa = 0;
+      } else {
+         ts->point_coord_aa = ts->max_generic + 1;
+         assert((ts->point_coord_enable & (1 << ts->point_coord_aa)) == 0);
+         ts->point_coord_enable |= 1 << (ts->point_coord_aa);
+         tgsi_transform_output_decl(ctx, ts->num_out++, TGSI_SEMANTIC_GENERIC,
+                                    ts->point_coord_aa, 0);
+      }
    }
 
    /* Declare extra immediates */
@@ -503,6 +522,7 @@ tgsi_add_point_sprite(const struct tgsi_token *tokens_in,
                       const unsigned point_coord_enable,
                       const bool sprite_origin_lower_left,
                       const bool stream_out_point_pos,
+                     const bool need_texcoord_semantic,
                       int *aa_point_coord_index)
 {
    struct psprite_transform_context transform;
@@ -533,6 +553,7 @@ tgsi_add_point_sprite(const struct tgsi_token *tokens_in,
    transform.stream_out_point_pos = stream_out_point_pos;
    transform.point_coord_enable = point_coord_enable;
    transform.aa_point = aa_point_coord_index != NULL;
+   transform.need_texcoord_semantic = need_texcoord_semantic;
    transform.max_generic = -1;
 
    /* point sprite directions based on the immediates (0, 1, 0.5, -1) */
index d195891..46e769c 100644 (file)
@@ -33,6 +33,7 @@ tgsi_add_point_sprite(const struct tgsi_token *tokens_in,
                       const unsigned point_coord_enable,
                       const bool sprite_origin_lower_left,
                       const bool stream_out_point_pos,
+                      const bool need_texcoord_semantic,
                       int *aa_point_coord_index);
 
 #endif /* TGSI_POINT_SPRITE_H */
index 394040d..588f1c2 100644 (file)
@@ -71,6 +71,11 @@ svga_link_shaders(const struct tgsi_shader_info *outshader_info,
       unsigned j;
       unsigned out_index;
 
+      if (sem_name == TGSI_SEMANTIC_PCOORD) {
+         sem_name = TGSI_SEMANTIC_TEXCOORD;
+         sem_index = 0;
+      }
+
       /* search output shader outputs for same item */
       for (j = 0; j < outshader_info->num_outputs; j++) {
          assert(j < ARRAY_SIZE(outshader_info->output_semantic_name));
index 5e7069f..8974cd9 100644 (file)
@@ -241,6 +241,9 @@ emulate_point_sprite(struct svga_context *svga,
    struct svga_stream_output *streamout = NULL;
    int pos_out_index = -1;
    int aa_point_coord_index = -1;
+   struct pipe_screen *screen = svga->pipe.screen;
+   bool has_texcoord_semantic =
+      screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD);
 
    assert(tokens != NULL);
 
@@ -250,6 +253,8 @@ emulate_point_sprite(struct svga_context *svga,
    memset(&key, 0, sizeof key);
    key.gs.writes_psize = 1;
    key.gs.sprite_coord_enable = svga->curr.rast->templ.sprite_coord_enable;
+   if (has_texcoord_semantic)
+      key.gs.sprite_coord_enable |= 0x1;   /* For TGSI_SEMANTIC_PCOORD */
 
    key.gs.sprite_origin_upper_left =
       !(svga->curr.rast->templ.sprite_coord_mode == PIPE_SPRITE_COORD_LOWER_LEFT);
@@ -284,6 +289,7 @@ emulate_point_sprite(struct svga_context *svga,
                                          key.gs.sprite_coord_enable,
                                          key.gs.sprite_origin_upper_left,
                                          key.gs.point_pos_stream_out,
+                                        has_texcoord_semantic,
                                          key.gs.aa_point ?
                                             &aa_point_coord_index : NULL);
 
index b8499df..07f2857 100644 (file)
@@ -12694,14 +12694,18 @@ transform_fs_pstipple(struct svga_shader_emitter_v10 *emit,
  * Modify the FS to support anti-aliasing point.
  */
 static const struct tgsi_token *
-transform_fs_aapoint(const struct tgsi_token *tokens,
+transform_fs_aapoint(struct svga_context *svga,
+                    const struct tgsi_token *tokens,
                      int aa_coord_index)
 {
+   bool need_texcoord_semantic =
+      svga->pipe.screen->get_param(svga->pipe.screen, PIPE_CAP_TGSI_TEXCOORD);
+
    if (0) {
       debug_printf("Before tgsi_add_aa_point ------------------\n");
       tgsi_dump(tokens,0);
    }
-   tokens = tgsi_add_aa_point(tokens, aa_coord_index);
+   tokens = tgsi_add_aa_point(tokens, aa_coord_index, need_texcoord_semantic);
    if (0) {
       debug_printf("After tgsi_add_aa_point ------------------\n");
       tgsi_dump(tokens, 0);
@@ -12961,7 +12965,8 @@ svga_tgsi_vgpu10_translate(struct svga_context *svga,
          tokens = new_tokens;
       }
       if (key->fs.aa_point) {
-         tokens = transform_fs_aapoint(tokens, key->fs.aa_point_coord_index);
+         tokens = transform_fs_aapoint(svga, tokens,
+                                      key->fs.aa_point_coord_index);
       }
    }