On Wed, Aug 24, 2016 at 5:16 PM, Jason Ekstrand <[email protected]> wrote: > The pipeline layout affects shader compilation because it is what > determines binding table locations as well as whether or not a particular > buffer has dynamic offsets. Since this affects the generated shader, it > needs to be in the hash. This fixes a bunch of CTS tests now that the CTS > is using a pipeline cache. > > Signed-off-by: Jason Ekstrand <[email protected]> > Cc: Kristian Høgsberg <[email protected]>
That looks good, Reviewed-by: Kristian Høgsberg <[email protected]> > --- > src/intel/vulkan/anv_descriptor_set.c | 24 ++++++++++++++++++++++++ > src/intel/vulkan/anv_pipeline.c | 12 ++++++++---- > src/intel/vulkan/anv_pipeline_cache.c | 2 ++ > src/intel/vulkan/anv_private.h | 3 +++ > 4 files changed, 37 insertions(+), 4 deletions(-) > > diff --git a/src/intel/vulkan/anv_descriptor_set.c > b/src/intel/vulkan/anv_descriptor_set.c > index bd3ebed..cf1fe15 100644 > --- a/src/intel/vulkan/anv_descriptor_set.c > +++ b/src/intel/vulkan/anv_descriptor_set.c > @@ -27,6 +27,8 @@ > #include <unistd.h> > #include <fcntl.h> > > +#include "util/mesa-sha1.h" > + > #include "anv_private.h" > > /* > @@ -202,6 +204,15 @@ void anv_DestroyDescriptorSetLayout( > anv_free2(&device->alloc, pAllocator, set_layout); > } > > +static void > +sha1_update_descriptor_set_layout(struct mesa_sha1 *ctx, > + const struct anv_descriptor_set_layout > *layout) > +{ > + size_t size = sizeof(*layout) + > + sizeof(layout->binding[0]) * layout->binding_count; > + _mesa_sha1_update(ctx, layout, size); > +} > + > /* > * Pipeline layouts. These have nothing to do with the pipeline. They are > * just muttiple descriptor set layouts pasted together > @@ -246,6 +257,19 @@ VkResult anv_CreatePipelineLayout( > } > } > > + struct mesa_sha1 *ctx = _mesa_sha1_init(); > + for (unsigned s = 0; s < layout->num_sets; s++) { > + sha1_update_descriptor_set_layout(ctx, layout->set[s].layout); > + _mesa_sha1_update(ctx, &layout->set[s].dynamic_offset_start, > + sizeof(layout->set[s].dynamic_offset_start)); > + } > + _mesa_sha1_update(ctx, &layout->num_sets, sizeof(layout->num_sets)); > + for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) { > + _mesa_sha1_update(ctx, &layout->stage[s].has_dynamic_offsets, > + sizeof(layout->stage[s].has_dynamic_offsets)); > + } > + _mesa_sha1_final(ctx, layout->sha1); > + > *pPipelineLayout = anv_pipeline_layout_to_handle(layout); > > return VK_SUCCESS; > diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c > index e559c07..38f6e48 100644 > --- a/src/intel/vulkan/anv_pipeline.c > +++ b/src/intel/vulkan/anv_pipeline.c > @@ -424,7 +424,8 @@ anv_pipeline_compile_vs(struct anv_pipeline *pipeline, > populate_vs_prog_key(&pipeline->device->info, &key); > > if (module->size > 0) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > spec_info); > + anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > + pipeline->layout, spec_info); > kernel = anv_pipeline_cache_search(cache, sha1, &stage_prog_data, > &map); > } > > @@ -512,7 +513,8 @@ anv_pipeline_compile_gs(struct anv_pipeline *pipeline, > populate_gs_prog_key(&pipeline->device->info, &key); > > if (module->size > 0) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > spec_info); > + anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > + pipeline->layout, spec_info); > kernel = anv_pipeline_cache_search(cache, sha1, &stage_prog_data, > &map); > } > > @@ -591,7 +593,8 @@ anv_pipeline_compile_fs(struct anv_pipeline *pipeline, > populate_wm_prog_key(&pipeline->device->info, info, extra, &key); > > if (module->size > 0) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > spec_info); > + anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > + pipeline->layout, spec_info); > pipeline->ps_ksp0 = > anv_pipeline_cache_search(cache, sha1, &stage_prog_data, &map); > } > @@ -721,7 +724,8 @@ anv_pipeline_compile_cs(struct anv_pipeline *pipeline, > populate_cs_prog_key(&pipeline->device->info, &key); > > if (module->size > 0) { > - anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > spec_info); > + anv_hash_shader(sha1, &key, sizeof(key), module, entrypoint, > + pipeline->layout, spec_info); > kernel = anv_pipeline_cache_search(cache, sha1, &stage_prog_data, > &map); > } > > diff --git a/src/intel/vulkan/anv_pipeline_cache.c > b/src/intel/vulkan/anv_pipeline_cache.c > index 6af15d4..6342803 100644 > --- a/src/intel/vulkan/anv_pipeline_cache.c > +++ b/src/intel/vulkan/anv_pipeline_cache.c > @@ -104,6 +104,7 @@ void > anv_hash_shader(unsigned char *hash, const void *key, size_t key_size, > struct anv_shader_module *module, > const char *entrypoint, > + const struct anv_pipeline_layout *pipeline_layout, > const VkSpecializationInfo *spec_info) > { > struct mesa_sha1 *ctx; > @@ -112,6 +113,7 @@ anv_hash_shader(unsigned char *hash, const void *key, > size_t key_size, > _mesa_sha1_update(ctx, key, key_size); > _mesa_sha1_update(ctx, module->sha1, sizeof(module->sha1)); > _mesa_sha1_update(ctx, entrypoint, strlen(entrypoint)); > + _mesa_sha1_update(ctx, pipeline_layout->sha1, > sizeof(pipeline_layout->sha1)); > /* hash in shader stage, pipeline layout? */ > if (spec_info) { > _mesa_sha1_update(ctx, spec_info->pMapEntries, > diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h > index 0de6597..a0a75be 100644 > --- a/src/intel/vulkan/anv_private.h > +++ b/src/intel/vulkan/anv_private.h > @@ -1070,6 +1070,8 @@ struct anv_pipeline_layout { > struct { > bool has_dynamic_offsets; > } stage[MESA_SHADER_STAGES]; > + > + unsigned char sha1[20]; > }; > > struct anv_buffer { > @@ -1435,6 +1437,7 @@ struct anv_shader_module { > void anv_hash_shader(unsigned char *hash, const void *key, size_t key_size, > struct anv_shader_module *module, > const char *entrypoint, > + const struct anv_pipeline_layout *pipeline_layout, > const VkSpecializationInfo *spec_info); > > static inline gl_shader_stage > -- > 2.5.0.400.gff86faf > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
