diff options
author | Iago Toral Quiroga <[email protected]> | 2017-03-03 10:57:17 +0100 |
---|---|---|
committer | Iago Toral Quiroga <[email protected]> | 2017-03-16 11:40:05 +0100 |
commit | 88b539c4a03e3d680c297b60cc7a58a9e05fa0d6 (patch) | |
tree | 9c96523ec7665aad7b68582cbd6a9ee28eeabb3d | |
parent | bad3a2e91183aeb50d86b3d8929d0a270f094dfb (diff) |
anv: do not try to ref/unref NULL shaders
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 <[email protected]>
-rw-r--r-- | src/intel/vulkan/anv_pipeline_cache.c | 5 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 4 |
2 files changed, 6 insertions, 3 deletions
diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c index 0b677a49f3d..cdd8215b9b5 100644 --- a/src/intel/vulkan/anv_pipeline_cache.c +++ b/src/intel/vulkan/anv_pipeline_cache.c @@ -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; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 7682bfcc757..eec1cd6f8d0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -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); } |