st/mesa: Copy VP TGSI tokens if they exist, even for NIR shaders.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 15 Feb 2019 08:00:39 +0000 (00:00 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 19 Feb 2019 23:56:19 +0000 (15:56 -0800)
Even if the driver wants to use NIR shaders, we may need to have TGSI
tokens for creating draw module vertex shaders for the feedback/select
render modes.

So...if the st_vertex_program has any TGSI...copy it to the variant.

Acked-by: Eric Anholt <eric@anholt.net>
Tested-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/mesa/state_tracker/st_program.c

index 422b7b2a593ebe591862cc8707aacb1761f55fb0..4d017d8c61d9fd9bbe6bc6f98251ac8c5ae57719 100644 (file)
@@ -554,6 +554,14 @@ st_create_vp_variant(struct st_context *st,
    vpv->tgsi.stream_output = stvp->tgsi.stream_output;
    vpv->num_inputs = stvp->num_inputs;
 
+   /* When generating a NIR program, we usually don't have TGSI tokens.
+    * However, we do create them for ARB_vertex_program / fixed-function VS
+    * 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->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);
@@ -573,8 +581,6 @@ st_create_vp_variant(struct st_context *st,
       return vpv;
    }
 
-   vpv->tgsi.tokens = tgsi_dup_tokens(stvp->tgsi.tokens);
-
    /* Emulate features. */
    if (key->clamp_color || key->passthrough_edgeflags) {
       const struct tgsi_token *tokens;