anv: do not try to ref/unref NULL shaders
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 3 Mar 2017 09:57:17 +0000 (10:57 +0100)
committerIago Toral Quiroga <itoral@igalia.com>
Thu, 16 Mar 2017 10:40:05 +0000 (11:40 +0100)
This situation can happen if we failed to allocate memory for the shader.

v2:
 - We shouldn't see NULL shaders in anv_shader_bin_ref so we should not check
   for that (Jason). Make sure that callers don't attempt to call this
   function with a NULL shader and assert that this never happens (Iago).

v3:
 - All callers to anv_shader_bin_unref seem to check for NULL before calling,
   so just assert that it is not NULL (Topi)

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/intel/vulkan/anv_pipeline_cache.c
src/intel/vulkan/anv_private.h

index 0b677a49f3de6297053112eaee16c8b636710a88..cdd8215b9b574df5bee6b977fbe51682258f4c95 100644 (file)
@@ -308,7 +308,8 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
       pthread_mutex_unlock(&cache->mutex);
 
       /* We increment refcount before handing it to the caller */
-      anv_shader_bin_ref(bin);
+      if (bin)
+         anv_shader_bin_ref(bin);
 
       return bin;
    } else {
@@ -546,6 +547,8 @@ VkResult anv_MergePipelineCaches(
       struct hash_entry *entry;
       hash_table_foreach(src->cache, entry) {
          struct anv_shader_bin *bin = entry->data;
+         assert(bin);
+
          if (_mesa_hash_table_search(dst->cache, bin->key))
             continue;
 
index 7682bfcc757791d21877004f47308f18b916b28e..eec1cd6f8d0b3125e12099326e937d3efab9aa54 100644 (file)
@@ -1556,14 +1556,14 @@ anv_shader_bin_destroy(struct anv_device *device, struct anv_shader_bin *shader)
 static inline void
 anv_shader_bin_ref(struct anv_shader_bin *shader)
 {
-   assert(shader->ref_cnt >= 1);
+   assert(shader && shader->ref_cnt >= 1);
    __sync_fetch_and_add(&shader->ref_cnt, 1);
 }
 
 static inline void
 anv_shader_bin_unref(struct anv_device *device, struct anv_shader_bin *shader)
 {
-   assert(shader->ref_cnt >= 1);
+   assert(shader && shader->ref_cnt >= 1);
    if (__sync_fetch_and_add(&shader->ref_cnt, -1) == 1)
       anv_shader_bin_destroy(device, shader);
 }