#include "nir/nir_serialize.h"
#include "anv_private.h"
#include "nir/nir_xfb_info.h"
+#include "vulkan/util/vk_util.h"
struct anv_shader_bin *
anv_shader_bin_create(struct anv_device *device,
gl_shader_stage stage,
const void *key_data, uint32_t key_size,
const void *kernel_data, uint32_t kernel_size,
- const void *constant_data, uint32_t constant_data_size,
const struct brw_stage_prog_data *prog_data_in,
uint32_t prog_data_size,
const struct brw_compile_stats *stats, uint32_t num_stats,
memcpy(shader->kernel.map, kernel_data, kernel_size);
shader->kernel_size = kernel_size;
- if (constant_data_size) {
- shader->constant_data =
- anv_state_pool_alloc(&device->dynamic_state_pool,
- constant_data_size, 32);
- memcpy(shader->constant_data.map, constant_data, constant_data_size);
- } else {
- shader->constant_data = ANV_STATE_NULL;
- }
- shader->constant_data_size = constant_data_size;
-
memcpy(prog_data, prog_data_in, prog_data_size);
memset(prog_data_param, 0,
prog_data->nr_params * sizeof(*prog_data_param));
{
assert(shader->ref_cnt == 0);
anv_state_pool_free(&device->instruction_state_pool, shader->kernel);
- anv_state_pool_free(&device->dynamic_state_pool, shader->constant_data);
vk_free(&device->vk.alloc, shader);
}
blob_write_uint32(blob, shader->kernel_size);
blob_write_bytes(blob, shader->kernel.map, shader->kernel_size);
- blob_write_uint32(blob, shader->constant_data_size);
- blob_write_bytes(blob, shader->constant_data.map,
- shader->constant_data_size);
-
blob_write_uint32(blob, shader->prog_data_size);
blob_write_bytes(blob, shader->prog_data, shader->prog_data_size);
uint32_t kernel_size = blob_read_uint32(blob);
const void *kernel_data = blob_read_bytes(blob, kernel_size);
- uint32_t constant_data_size = blob_read_uint32(blob);
- const void *constant_data = blob_read_bytes(blob, constant_data_size);
-
uint32_t prog_data_size = blob_read_uint32(blob);
const struct brw_stage_prog_data *prog_data =
blob_read_bytes(blob, prog_data_size);
return anv_shader_bin_create(device, stage,
key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats, xfb_info, &bind_map);
}
void
anv_pipeline_cache_init(struct anv_pipeline_cache *cache,
struct anv_device *device,
- bool cache_enabled)
+ bool cache_enabled,
+ bool external_sync)
{
vk_object_base_init(&device->vk, &cache->base,
VK_OBJECT_TYPE_PIPELINE_CACHE);
cache->device = device;
+ cache->external_sync = external_sync;
pthread_mutex_init(&cache->mutex, NULL);
if (cache_enabled) {
return NULL;
}
+static inline void
+anv_cache_lock(struct anv_pipeline_cache *cache)
+{
+ if (!cache->external_sync)
+ pthread_mutex_lock(&cache->mutex);
+}
+
+static inline void
+anv_cache_unlock(struct anv_pipeline_cache *cache)
+{
+ if (!cache->external_sync)
+ pthread_mutex_unlock(&cache->mutex);
+}
+
struct anv_shader_bin *
anv_pipeline_cache_search(struct anv_pipeline_cache *cache,
const void *key_data, uint32_t key_size)
if (!cache->cache)
return NULL;
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
struct anv_shader_bin *shader =
anv_pipeline_cache_search_locked(cache, key_data, key_size);
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
/* We increment refcount before handing it to the caller */
if (shader)
if (!cache->cache)
return;
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
struct hash_entry *entry = _mesa_hash_table_search(cache->cache, bin->key);
if (entry == NULL) {
_mesa_hash_table_insert(cache->cache, bin->key, bin);
}
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
}
static struct anv_shader_bin *
const void *key_data, uint32_t key_size,
const void *kernel_data,
uint32_t kernel_size,
- const void *constant_data,
- uint32_t constant_data_size,
const struct brw_stage_prog_data *prog_data,
uint32_t prog_data_size,
const struct brw_compile_stats *stats,
anv_shader_bin_create(cache->device, stage,
key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats, xfb_info, bind_map);
if (!bin)
gl_shader_stage stage,
const void *key_data, uint32_t key_size,
const void *kernel_data, uint32_t kernel_size,
- const void *constant_data,
- uint32_t constant_data_size,
const struct brw_stage_prog_data *prog_data,
uint32_t prog_data_size,
const struct brw_compile_stats *stats,
const struct anv_pipeline_bind_map *bind_map)
{
if (cache->cache) {
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
struct anv_shader_bin *bin =
anv_pipeline_cache_add_shader_locked(cache, stage, key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats,
xfb_info, bind_map);
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
/* We increment refcount before handing it to the caller */
if (bin)
return anv_shader_bin_create(cache->device, stage,
key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats,
xfb_info, bind_map);
}
}
-struct cache_header {
- uint32_t header_size;
- uint32_t header_version;
- uint32_t vendor_id;
- uint32_t device_id;
- uint8_t uuid[VK_UUID_SIZE];
-};
-
static void
anv_pipeline_cache_load(struct anv_pipeline_cache *cache,
const void *data, size_t size)
struct blob_reader blob;
blob_reader_init(&blob, data, size);
- struct cache_header header;
+ struct vk_pipeline_cache_header header;
blob_copy_bytes(&blob, &header, sizeof(header));
uint32_t count = blob_read_uint32(&blob);
if (blob.overrun)
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
anv_pipeline_cache_init(cache, device,
- device->physical->instance->pipeline_cache_enabled);
+ device->physical->instance->pipeline_cache_enabled,
+ pCreateInfo->flags & VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT);
if (pCreateInfo->initialDataSize > 0)
anv_pipeline_cache_load(cache,
blob_init_fixed(&blob, NULL, SIZE_MAX);
}
- struct cache_header header = {
- .header_size = sizeof(struct cache_header),
+ struct vk_pipeline_cache_header header = {
+ .header_size = sizeof(struct vk_pipeline_cache_header),
.header_version = VK_PIPELINE_CACHE_HEADER_VERSION_ONE,
.vendor_id = 0x8086,
.device_id = device->info.chipset_id,
gl_shader_stage stage,
const void *key_data, uint32_t key_size,
const void *kernel_data, uint32_t kernel_size,
- const void *constant_data,
- uint32_t constant_data_size,
const struct brw_stage_prog_data *prog_data,
uint32_t prog_data_size,
const struct brw_compile_stats *stats,
if (cache) {
bin = anv_pipeline_cache_upload_kernel(cache, stage, key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats,
xfb_info, bind_map);
} else {
bin = anv_shader_bin_create(device, stage, key_data, key_size,
kernel_data, kernel_size,
- constant_data, constant_data_size,
prog_data, prog_data_size,
stats, num_stats,
xfb_info, bind_map);
if (cache && cache->nir_cache) {
const struct serialized_nir *snir = NULL;
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
struct hash_entry *entry =
_mesa_hash_table_search(cache->nir_cache, sha1_key);
if (entry)
snir = entry->data;
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
if (snir) {
struct blob_reader blob;
unsigned char sha1_key[20])
{
if (cache && cache->nir_cache) {
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
struct hash_entry *entry =
_mesa_hash_table_search(cache->nir_cache, sha1_key);
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
if (entry)
return;
return;
}
- pthread_mutex_lock(&cache->mutex);
+ anv_cache_lock(cache);
/* Because ralloc isn't thread-safe, we have to do all this inside the
* lock. We could unlock for the big memcpy but it's probably not worth
* the hassle.
entry = _mesa_hash_table_search(cache->nir_cache, sha1_key);
if (entry) {
blob_finish(&blob);
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
return;
}
_mesa_hash_table_insert(cache->nir_cache, snir->sha1_key, snir);
- pthread_mutex_unlock(&cache->mutex);
+ anv_cache_unlock(cache);
}
}