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 <topi.pohjolainen@intel.com>
This commit is contained in:
parent
bad3a2e911
commit
88b539c4a0
|
@ -308,6 +308,7 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
|
||||||
pthread_mutex_unlock(&cache->mutex);
|
pthread_mutex_unlock(&cache->mutex);
|
||||||
|
|
||||||
/* We increment refcount before handing it to the caller */
|
/* We increment refcount before handing it to the caller */
|
||||||
|
if (bin)
|
||||||
anv_shader_bin_ref(bin);
|
anv_shader_bin_ref(bin);
|
||||||
|
|
||||||
return bin;
|
return bin;
|
||||||
|
@ -546,6 +547,8 @@ VkResult anv_MergePipelineCaches(
|
||||||
struct hash_entry *entry;
|
struct hash_entry *entry;
|
||||||
hash_table_foreach(src->cache, entry) {
|
hash_table_foreach(src->cache, entry) {
|
||||||
struct anv_shader_bin *bin = entry->data;
|
struct anv_shader_bin *bin = entry->data;
|
||||||
|
assert(bin);
|
||||||
|
|
||||||
if (_mesa_hash_table_search(dst->cache, bin->key))
|
if (_mesa_hash_table_search(dst->cache, bin->key))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -1556,14 +1556,14 @@ anv_shader_bin_destroy(struct anv_device *device, struct anv_shader_bin *shader)
|
||||||
static inline void
|
static inline void
|
||||||
anv_shader_bin_ref(struct anv_shader_bin *shader)
|
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);
|
__sync_fetch_and_add(&shader->ref_cnt, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
anv_shader_bin_unref(struct anv_device *device, struct anv_shader_bin *shader)
|
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)
|
if (__sync_fetch_and_add(&shader->ref_cnt, -1) == 1)
|
||||||
anv_shader_bin_destroy(device, shader);
|
anv_shader_bin_destroy(device, shader);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue