From 8cbcdb4f10a4146123c8bbb8cf16fbb2a3f794a7 Mon Sep 17 00:00:00 2001 From: Charmaine Lee Date: Tue, 17 May 2022 17:20:53 -0700 Subject: [PATCH] svga: add need_texcoord_semantic to tgsi_add_point_sprite & tgsi_add_aa_point 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 Part-of: --- src/gallium/auxiliary/tgsi/tgsi_aa_point.c | 16 +++++-- src/gallium/auxiliary/tgsi/tgsi_aa_point.h | 3 +- .../auxiliary/tgsi/tgsi_point_sprite.c | 43 ++++++++++++++----- .../auxiliary/tgsi/tgsi_point_sprite.h | 1 + src/gallium/drivers/svga/svga_link.c | 5 +++ .../drivers/svga/svga_state_tgsi_transform.c | 6 +++ src/gallium/drivers/svga/svga_tgsi_vgpu10.c | 11 +++-- 7 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_aa_point.c b/src/gallium/auxiliary/tgsi/tgsi_aa_point.c index 58f610fc485..ace4d9a104b 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_aa_point.c +++ b/src/gallium/auxiliary/tgsi/tgsi_aa_point.c @@ -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; diff --git a/src/gallium/auxiliary/tgsi/tgsi_aa_point.h b/src/gallium/auxiliary/tgsi/tgsi_aa_point.h index d89f40cc389..160bc037530 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_aa_point.h +++ b/src/gallium/auxiliary/tgsi/tgsi_aa_point.h @@ -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 */ diff --git a/src/gallium/auxiliary/tgsi/tgsi_point_sprite.c b/src/gallium/auxiliary/tgsi/tgsi_point_sprite.c index 432a137fcd7..eb17a1be07d 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_point_sprite.c +++ b/src/gallium/auxiliary/tgsi/tgsi_point_sprite.c @@ -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) */ diff --git a/src/gallium/auxiliary/tgsi/tgsi_point_sprite.h b/src/gallium/auxiliary/tgsi/tgsi_point_sprite.h index d1958914bc3..46e769c0c12 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_point_sprite.h +++ b/src/gallium/auxiliary/tgsi/tgsi_point_sprite.h @@ -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 */ diff --git a/src/gallium/drivers/svga/svga_link.c b/src/gallium/drivers/svga/svga_link.c index 394040d9303..588f1c23113 100644 --- a/src/gallium/drivers/svga/svga_link.c +++ b/src/gallium/drivers/svga/svga_link.c @@ -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)); diff --git a/src/gallium/drivers/svga/svga_state_tgsi_transform.c b/src/gallium/drivers/svga/svga_state_tgsi_transform.c index 5e7069fe152..8974cd93bb1 100644 --- a/src/gallium/drivers/svga/svga_state_tgsi_transform.c +++ b/src/gallium/drivers/svga/svga_state_tgsi_transform.c @@ -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); diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c index b8499df59e4..07f2857dd47 100644 --- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c +++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c @@ -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); } }