On Tue, Nov 01, 2016 at 08:09:12PM -0700, Jason Ekstrand wrote: > While we can simply calculate offsets to get to things such as the > prog_data and the key, it's much more user-friendly if there are just > pointers. Also, it's a bit more fool-proof. > > While we're at it, we rework the pipeline cache API to use the > brw_stage_prog_data type directly.
Clearer: Reviewed-by: Topi Pohjolainen <topi.pohjolai...@intel.com> > > Signed-off-by: Jason Ekstrand <ja...@jlekstrand.net> > --- > src/intel/vulkan/anv_blorp.c | 6 ++--- > src/intel/vulkan/anv_cmd_buffer.c | 2 +- > src/intel/vulkan/anv_pipeline.c | 17 +++++++++----- > src/intel/vulkan/anv_pipeline_cache.c | 42 > +++++++++++++---------------------- > src/intel/vulkan/anv_private.h | 28 ++++++++++++----------- > 5 files changed, 45 insertions(+), 50 deletions(-) > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c > index 79153a3..87f242c 100644 > --- a/src/intel/vulkan/anv_blorp.c > +++ b/src/intel/vulkan/anv_blorp.c > @@ -44,8 +44,7 @@ lookup_blorp_shader(struct blorp_context *blorp, > anv_shader_bin_unref(device, bin); > > *kernel_out = bin->kernel.offset; > - *(const struct brw_stage_prog_data **)prog_data_out = > - anv_shader_bin_get_prog_data(bin); > + *(const struct brw_stage_prog_data **)prog_data_out = bin->prog_data; > > return true; > } > @@ -79,8 +78,7 @@ upload_blorp_shader(struct blorp_context *blorp, > anv_shader_bin_unref(device, bin); > > *kernel_out = bin->kernel.offset; > - *(const struct brw_stage_prog_data **)prog_data_out = > - anv_shader_bin_get_prog_data(bin); > + *(const struct brw_stage_prog_data **)prog_data_out = bin->prog_data; > } > > void > diff --git a/src/intel/vulkan/anv_cmd_buffer.c > b/src/intel/vulkan/anv_cmd_buffer.c > index a652f9a..7ff7dba 100644 > --- a/src/intel/vulkan/anv_cmd_buffer.c > +++ b/src/intel/vulkan/anv_cmd_buffer.c > @@ -658,7 +658,7 @@ anv_cmd_buffer_push_constants(struct anv_cmd_buffer > *cmd_buffer, > struct anv_push_constants *data = > cmd_buffer->state.push_constants[stage]; > const struct brw_stage_prog_data *prog_data = > - > anv_shader_bin_get_prog_data(cmd_buffer->state.pipeline->shaders[stage]); > + cmd_buffer->state.pipeline->shaders[stage]->prog_data; > > /* If we don't actually have any push constants, bail. */ > if (data == NULL || prog_data == NULL || prog_data->nr_params == 0) > diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c > index 0aac711..d0bffc1 100644 > --- a/src/intel/vulkan/anv_pipeline.c > +++ b/src/intel/vulkan/anv_pipeline.c > @@ -388,7 +388,8 @@ anv_pipeline_upload_kernel(struct anv_pipeline *pipeline, > struct anv_pipeline_cache *cache, > const void *key_data, uint32_t key_size, > const void *kernel_data, uint32_t kernel_size, > - const void *prog_data, uint32_t prog_data_size, > + const struct brw_stage_prog_data *prog_data, > + uint32_t prog_data_size, > const struct anv_pipeline_bind_map *bind_map) > { > if (cache) { > @@ -476,7 +477,8 @@ anv_pipeline_compile_vs(struct anv_pipeline *pipeline, > > bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20, > shader_code, code_size, > - &prog_data, sizeof(prog_data), &map); > + &prog_data.base.base, > sizeof(prog_data), > + &map); > if (!bin) { > ralloc_free(mem_ctx); > return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); > @@ -486,7 +488,7 @@ anv_pipeline_compile_vs(struct anv_pipeline *pipeline, > } > > const struct brw_vs_prog_data *vs_prog_data = > - (const struct brw_vs_prog_data *)anv_shader_bin_get_prog_data(bin); > + (const struct brw_vs_prog_data *)bin->prog_data; > > if (vs_prog_data->base.dispatch_mode == DISPATCH_MODE_SIMD8) { > pipeline->vs_simd8 = bin->kernel.offset; > @@ -563,7 +565,8 @@ anv_pipeline_compile_gs(struct anv_pipeline *pipeline, > /* TODO: SIMD8 GS */ > bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20, > shader_code, code_size, > - &prog_data, sizeof(prog_data), &map); > + &prog_data.base.base, > sizeof(prog_data), > + &map); > if (!bin) { > ralloc_free(mem_ctx); > return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); > @@ -686,7 +689,8 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline, > > bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20, > shader_code, code_size, > - &prog_data, sizeof(prog_data), &map); > + &prog_data.base, sizeof(prog_data), > + &map); > if (!bin) { > ralloc_free(mem_ctx); > return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); > @@ -758,7 +762,8 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline, > > bin = anv_pipeline_upload_kernel(pipeline, cache, sha1, 20, > shader_code, code_size, > - &prog_data, sizeof(prog_data), &map); > + &prog_data.base, sizeof(prog_data), > + &map); > if (!bin) { > ralloc_free(mem_ctx); > return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); > diff --git a/src/intel/vulkan/anv_pipeline_cache.c > b/src/intel/vulkan/anv_pipeline_cache.c > index 79df315..9fd12a1 100644 > --- a/src/intel/vulkan/anv_pipeline_cache.c > +++ b/src/intel/vulkan/anv_pipeline_cache.c > @@ -26,11 +26,6 @@ > #include "util/debug.h" > #include "anv_private.h" > > -struct shader_bin_key { > - uint32_t size; > - uint8_t data[0]; > -}; > - > static size_t > anv_shader_bin_size(uint32_t prog_data_size, uint32_t key_size, > uint32_t surface_count, uint32_t sampler_count) > @@ -44,20 +39,12 @@ anv_shader_bin_size(uint32_t prog_data_size, uint32_t > key_size, > align_u32(binding_data_size, 8); > } > > -static inline const struct shader_bin_key * > -anv_shader_bin_get_key(const struct anv_shader_bin *shader) > -{ > - const void *data = shader; > - data += align_u32(sizeof(struct anv_shader_bin), 8); > - data += align_u32(shader->prog_data_size, 8); > - return data; > -} > - > struct anv_shader_bin * > anv_shader_bin_create(struct anv_device *device, > const void *key_data, uint32_t key_size, > const void *kernel_data, uint32_t kernel_size, > - const void *prog_data, uint32_t prog_data_size, > + const struct brw_stage_prog_data *prog_data, > + uint32_t prog_data_size, > const struct anv_pipeline_bind_map *bind_map) > { > const size_t size = > @@ -82,10 +69,12 @@ anv_shader_bin_create(struct anv_device *device, > void *data = shader; > data += align_u32(sizeof(struct anv_shader_bin), 8); > > + shader->prog_data = data; > memcpy(data, prog_data, prog_data_size); > data += align_u32(prog_data_size, 8); > > - struct shader_bin_key *key = data; > + shader->key = data; > + struct anv_shader_bin_key *key = data; > key->size = key_size; > memcpy(key->data, key_data, key_size); > data += align_u32(sizeof(*key) + key_size, 8); > @@ -115,7 +104,7 @@ static size_t > anv_shader_bin_data_size(const struct anv_shader_bin *shader) > { > return anv_shader_bin_size(shader->prog_data_size, > - anv_shader_bin_get_key(shader)->size, > + shader->key->size, > shader->bind_map.surface_count, > shader->bind_map.sampler_count) + > align_u32(shader->kernel_size, 8); > @@ -126,7 +115,7 @@ anv_shader_bin_write_data(const struct anv_shader_bin > *shader, void *data) > { > size_t struct_size = > anv_shader_bin_size(shader->prog_data_size, > - anv_shader_bin_get_key(shader)->size, > + shader->key->size, > shader->bind_map.surface_count, > shader->bind_map.sampler_count); > > @@ -151,14 +140,14 @@ anv_shader_bin_write_data(const struct anv_shader_bin > *shader, void *data) > static uint32_t > shader_bin_key_hash_func(const void *void_key) > { > - const struct shader_bin_key *key = void_key; > + const struct anv_shader_bin_key *key = void_key; > return _mesa_hash_data(key->data, key->size); > } > > static bool > shader_bin_key_compare_func(const void *void_a, const void *void_b) > { > - const struct shader_bin_key *a = void_a, *b = void_b; > + const struct anv_shader_bin_key *a = void_a, *b = void_b; > if (a->size != b->size) > return false; > > @@ -230,7 +219,7 @@ anv_pipeline_cache_search_locked(struct > anv_pipeline_cache *cache, > const void *key_data, uint32_t key_size) > { > uint32_t vla[1 + DIV_ROUND_UP(key_size, sizeof(uint32_t))]; > - struct shader_bin_key *key = (void *)vla; > + struct anv_shader_bin_key *key = (void *)vla; > key->size = key_size; > memcpy(key->data, key_data, key_size); > > @@ -281,7 +270,7 @@ anv_pipeline_cache_add_shader(struct anv_pipeline_cache > *cache, > if (!bin) > return NULL; > > - _mesa_hash_table_insert(cache->cache, anv_shader_bin_get_key(bin), bin); > + _mesa_hash_table_insert(cache->cache, bin->key, bin); > > return bin; > } > @@ -290,7 +279,8 @@ struct anv_shader_bin * > anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, > const void *key_data, uint32_t key_size, > const void *kernel_data, uint32_t > kernel_size, > - const void *prog_data, uint32_t > prog_data_size, > + const struct brw_stage_prog_data *prog_data, > + uint32_t prog_data_size, > const struct anv_pipeline_bind_map > *bind_map) > { > if (cache->cache) { > @@ -369,7 +359,7 @@ anv_pipeline_cache_load(struct anv_pipeline_cache *cache, > const void *prog_data = p; > p += align_u32(bin.prog_data_size, 8); > > - struct shader_bin_key key; > + struct anv_shader_bin_key key; > if (p + sizeof(key) > end) > break; > memcpy(&key, p, sizeof(key)); > @@ -532,11 +522,11 @@ VkResult anv_MergePipelineCaches( > struct hash_entry *entry; > hash_table_foreach(src->cache, entry) { > struct anv_shader_bin *bin = entry->data; > - if (_mesa_hash_table_search(dst->cache, > anv_shader_bin_get_key(bin))) > + if (_mesa_hash_table_search(dst->cache, bin->key)) > continue; > > anv_shader_bin_ref(bin); > - _mesa_hash_table_insert(dst->cache, anv_shader_bin_get_key(bin), > bin); > + _mesa_hash_table_insert(dst->cache, bin->key, bin); > } > } > > diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h > index 3fe9d7d..79f7c14 100644 > --- a/src/intel/vulkan/anv_private.h > +++ b/src/intel/vulkan/anv_private.h > @@ -516,7 +516,8 @@ struct anv_shader_bin * > anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache, > const void *key_data, uint32_t key_size, > const void *kernel_data, uint32_t > kernel_size, > - const void *prog_data, uint32_t > prog_data_size, > + const struct brw_stage_prog_data *prog_data, > + uint32_t prog_data_size, > const struct anv_pipeline_bind_map > *bind_map); > > struct anv_device { > @@ -1297,16 +1298,24 @@ struct anv_pipeline_bind_map { > struct anv_pipeline_binding * sampler_to_descriptor; > }; > > +struct anv_shader_bin_key { > + uint32_t size; > + uint8_t data[0]; > +}; > + > struct anv_shader_bin { > uint32_t ref_cnt; > > + const struct anv_shader_bin_key *key; > + > struct anv_state kernel; > uint32_t kernel_size; > > - struct anv_pipeline_bind_map bind_map; > - > + const struct brw_stage_prog_data *prog_data; > uint32_t prog_data_size; > > + struct anv_pipeline_bind_map bind_map; > + > /* Prog data follows, then the key, both aligned to 8-bytes */ > }; > > @@ -1314,7 +1323,8 @@ struct anv_shader_bin * > anv_shader_bin_create(struct anv_device *device, > const void *key, uint32_t key_size, > const void *kernel, uint32_t kernel_size, > - const void *prog_data, uint32_t prog_data_size, > + const struct brw_stage_prog_data *prog_data, > + uint32_t prog_data_size, > const struct anv_pipeline_bind_map *bind_map); > > void > @@ -1335,14 +1345,6 @@ anv_shader_bin_unref(struct anv_device *device, struct > anv_shader_bin *shader) > anv_shader_bin_destroy(device, shader); > } > > -static inline const struct brw_stage_prog_data * > -anv_shader_bin_get_prog_data(const struct anv_shader_bin *shader) > -{ > - const void *data = shader; > - data += align_u32(sizeof(struct anv_shader_bin), 8); > - return data; > -} > - > struct anv_pipeline { > struct anv_device * device; > struct anv_batch batch; > @@ -1409,7 +1411,7 @@ get_##prefix##_prog_data(struct anv_pipeline *pipeline) > \ > { \ > if (anv_pipeline_has_stage(pipeline, stage)) { \ > return (const struct brw_##prefix##_prog_data *) \ > - anv_shader_bin_get_prog_data(pipeline->shaders[stage]); \ > + pipeline->shaders[stage]->prog_data; \ > } else { \ > return NULL; \ > } \ > -- > 2.5.0.400.gff86faf > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev