svga: change svga_destroy_shader_variant() to return void
authorBrian Paul <brianp@vmware.com>
Tue, 9 Oct 2018 14:55:46 +0000 (08:55 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 9 Oct 2018 17:17:14 +0000 (11:17 -0600)
svga_destroy_shader_variant() itself flushes and retries the command
if there's a failure.  So no need for the callers to do it.  Other
callers of the function were already ignoring the return value.

This also fixes a corner-case double-free reported by Coverity
(and reported by Dave Airlie).

Tested with various OpenGL apps.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
src/gallium/drivers/svga/svga_pipe_fs.c
src/gallium/drivers/svga/svga_pipe_gs.c
src/gallium/drivers/svga/svga_pipe_vs.c
src/gallium/drivers/svga/svga_shader.c
src/gallium/drivers/svga/svga_shader.h

index aadfb1a54e179fb00c30e1e219a07935e2ffd63d..52366f0f216be51040baca23b1ad2864012f5b50 100644 (file)
@@ -108,12 +108,7 @@ svga_delete_fs_state(struct pipe_context *pipe, void *shader)
          svga->state.hw_draw.fs = NULL;
       }
 
-      ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
-      if (ret != PIPE_OK) {
-         svga_context_flush(svga, NULL);
-         ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
-         assert(ret == PIPE_OK);
-      }
+      svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_PS, variant);
    }
 
    FREE((void *)fs->base.tokens);
index 2fe5477529fa403aa3dc34d6a02a5594521f7800..cee92a0005bafaf35ab2a8bbd4c5b3d85dace214 100644 (file)
@@ -120,13 +120,7 @@ svga_delete_gs_state(struct pipe_context *pipe, void *shader)
             svga->state.hw_draw.gs = NULL;
          }
 
-         ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
-         if (ret != PIPE_OK) {
-            svga_context_flush(svga, NULL);
-            ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS,
-                                              variant);
-            assert(ret == PIPE_OK);
-         }
+         svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_GS, variant);
       }
 
       FREE((void *)gs->base.tokens);
index ba87cb43e8f28487e0ceaa602eaffab8def88029..3b6d2e9ad2fa5f73bf35f98b3b64fe70acb030f0 100644 (file)
@@ -199,12 +199,7 @@ svga_delete_vs_state(struct pipe_context *pipe, void *shader)
          svga->state.hw_draw.vs = NULL;
       }
 
-      ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
-      if (ret != PIPE_OK) {
-         svga_context_flush(svga, NULL);
-         ret = svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
-         assert(ret == PIPE_OK);
-      }
+      svga_destroy_shader_variant(svga, SVGA3D_SHADERTYPE_VS, variant);
    }
 
    FREE((void *)vs->base.tokens);
index 7a0bb3db447c3e61a2488ed29518b4e2402e246a..22e449835d54c773e8a60fc85ee75a8dec33d7a9 100644 (file)
@@ -541,7 +541,7 @@ svga_new_shader_variant(struct svga_context *svga)
 }
 
 
-enum pipe_error
+void
 svga_destroy_shader_variant(struct svga_context *svga,
                             SVGA3dShaderType type,
                             struct svga_shader_variant *variant)
@@ -557,6 +557,7 @@ svga_destroy_shader_variant(struct svga_context *svga,
             /* flush and try again */
             svga_context_flush(svga, NULL);
             ret = SVGA3D_vgpu10_DestroyShader(svga->swc, variant->id);
+            assert(ret == PIPE_OK);
          }
          util_bitmask_clear(svga->shader_id_bm, variant->id);
       }
@@ -583,8 +584,6 @@ svga_destroy_shader_variant(struct svga_context *svga,
    FREE(variant);
 
    svga->hud.num_shaders--;
-
-   return ret;
 }
 
 /*
index b80cf181441be992e72f6f1bfac92abe1cfb2004..68991e7264101f91166371a5568c5315c959efc2 100644 (file)
@@ -285,7 +285,7 @@ svga_set_shader(struct svga_context *svga,
 struct svga_shader_variant *
 svga_new_shader_variant(struct svga_context *svga);
 
-enum pipe_error
+void
 svga_destroy_shader_variant(struct svga_context *svga,
                             SVGA3dShaderType type,
                             struct svga_shader_variant *variant);