panfrost: Move the batch stack size adjustment out of panfrost_queue_draw()
[mesa.git] / src / gallium / drivers / svga / svga_state_gs.c
index 618bec248dd887303bdc316951e93022d37a4556..1eb4cebc08d5a36eb7146fc79e10e40d5bf4d20b 100644 (file)
@@ -87,9 +87,9 @@ compile_gs(struct svga_context *svga,
       }
    }
 
-   ret = svga_define_shader(svga, SVGA3D_SHADERTYPE_GS, variant);
+   ret = svga_define_shader(svga, variant);
    if (ret != PIPE_OK) {
-      svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
+      svga_destroy_shader_variant(svga, variant);
       return ret;
    }
 
@@ -129,44 +129,6 @@ make_gs_key(struct svga_context *svga, struct svga_compile_key *key)
 }
 
 
-/**
- * svga_reemit_gs_bindings - Reemit the geometry shader bindings
- */
-enum pipe_error
-svga_reemit_gs_bindings(struct svga_context *svga)
-{
-   enum pipe_error ret;
-   struct svga_winsys_gb_shader *gbshader = NULL;
-   SVGA3dShaderId shaderId = SVGA3D_INVALID_ID;
-
-   assert(svga->rebind.flags.gs);
-   assert(svga_have_gb_objects(svga));
-
-   /* Geometry Shader is only supported in vgpu10 */
-   assert(svga_have_vgpu10(svga));
-
-   if (svga->state.hw_draw.gs) {
-      gbshader = svga->state.hw_draw.gs->gb_shader;
-      shaderId = svga->state.hw_draw.gs->id;
-   }
-
-   if (!svga_need_to_rebind_resources(svga)) {
-      ret =  svga->swc->resource_rebind(svga->swc, NULL, gbshader,
-                                        SVGA_RELOC_READ);
-      goto out;
-   }
-
-   ret = SVGA3D_vgpu10_SetShader(svga->swc, SVGA3D_SHADERTYPE_GS,
-                                 gbshader, shaderId);
-
- out:
-   if (ret != PIPE_OK)
-      return ret;
-
-   svga->rebind.flags.gs = FALSE;
-   return PIPE_OK;
-}
-
 static enum pipe_error
 emit_hw_gs(struct svga_context *svga, unsigned dirty)
 {
@@ -175,6 +137,8 @@ emit_hw_gs(struct svga_context *svga, unsigned dirty)
    enum pipe_error ret = PIPE_OK;
    struct svga_compile_key key;
 
+   SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_EMITGS);
+
    /* If there's a user-defined GS, we should have a pointer to a derived
     * GS.  This should have been resolved in update_tgsi_transform().
     */
@@ -188,20 +152,28 @@ emit_hw_gs(struct svga_context *svga, unsigned dirty)
           *  Needs to unbind the geometry shader.
           */
          ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_GS, NULL);
+         if (ret != PIPE_OK)
+            goto done;
          svga->state.hw_draw.gs = NULL;
       }
-      return ret;
+      goto done;
    }
 
    /* If there is stream output info for this geometry shader, then use
     * it instead of the one from the vertex shader.
     */
    if (svga_have_gs_streamout(svga)) {
-      svga_set_stream_output(svga, gs->base.stream_output);
+      ret = svga_set_stream_output(svga, gs->base.stream_output);
+      if (ret != PIPE_OK) {
+         goto done;
+      }
    }
    else if (!svga_have_vs_streamout(svga)) {
       /* turn off stream out */
-      svga_set_stream_output(svga, NULL);
+      ret = svga_set_stream_output(svga, NULL);
+      if (ret != PIPE_OK) {
+         goto done;
+      }
    }
 
    /* SVGA_NEW_NEED_SWTNL */
@@ -218,7 +190,7 @@ emit_hw_gs(struct svga_context *svga, unsigned dirty)
       if (!variant) {
          ret = compile_gs(svga, gs, &key, &variant);
          if (ret != PIPE_OK)
-            return ret;
+            goto done;
 
          /* insert the new variant at head of linked list */
          assert(variant);
@@ -231,14 +203,16 @@ emit_hw_gs(struct svga_context *svga, unsigned dirty)
       /* Bind the new variant */
       ret = svga_set_shader(svga, SVGA3D_SHADERTYPE_GS, variant);
       if (ret != PIPE_OK)
-         return ret;
+         goto done;
 
       svga->rebind.flags.gs = FALSE;
       svga->dirty |= SVGA_NEW_GS_VARIANT;
       svga->state.hw_draw.gs = variant;
    }
 
-   return PIPE_OK;
+done:
+   SVGA_STATS_TIME_POP(svga_sws(svga));
+   return ret;
 }
 
 struct svga_tracked_state svga_hw_gs =