bug 14608: VkShaderModule object lifetime (WIP)

Remove VkShader.  We add a simple cache to intel_shader_module in place of
intel_shader.

https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14608
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp
index 7e8bc37..63c17a0 100644
--- a/layers/shader_checker.cpp
+++ b/layers/shader_checker.cpp
@@ -44,7 +44,6 @@
 
 // fwd decls
 struct shader_module;
-struct shader_object;
 struct render_pass;
 
 struct layer_data {
@@ -54,7 +53,6 @@
     VkLayerInstanceDispatchTable* instance_dispatch_table;
 
     std::unordered_map<VkShaderModule, shader_module *> shader_module_map;
-    std::unordered_map<VkShader, shader_object *> shader_object_map;
     std::unordered_map<VkDescriptorSetLayout, std::vector<VkDescriptorSetLayoutBinding>*> descriptor_set_layout_map;
     std::unordered_map<VkPipelineLayout, std::vector<std::vector<VkDescriptorSetLayoutBinding>*>*> pipeline_layout_map;
     std::unordered_map<VkRenderPass, render_pass *> render_pass_map;
@@ -85,19 +83,6 @@
     }
 };
 
-struct shader_object {
-    std::string name;
-    struct shader_module *module;
-    VkShaderStageFlagBits stage;
-
-    shader_object(layer_data *my_data, VkShaderCreateInfo const *pCreateInfo)
-    {
-        module = my_data->shader_module_map[pCreateInfo->module];
-        stage = pCreateInfo->stage;
-        name = pCreateInfo->pName;
-    }
-};
-
 struct render_pass {
     std::vector<std::vector<VkFormat>> subpass_color_formats;
 
@@ -636,21 +621,6 @@
     return res;
 }
 
-VK_LAYER_EXPORT VkResult VKAPI vkCreateShader(
-        VkDevice device,
-        const VkShaderCreateInfo *pCreateInfo,
-        const VkAllocationCallbacks* pAllocator,
-        VkShader *pShader)
-{
-    layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
-    VkResult res = my_data->device_dispatch_table->CreateShader(device, pCreateInfo, pAllocator, pShader);
-
-    loader_platform_thread_lock_mutex(&globalLock);
-    my_data->shader_object_map[*pShader] = new shader_object(my_data, pCreateInfo);
-    loader_platform_thread_unlock_mutex(&globalLock);
-    return res;
-}
-
 VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass(
         VkDevice device,
         const VkRenderPassCreateInfo *pCreateInfo,
@@ -1054,22 +1024,20 @@
         VkPipelineShaderStageCreateInfo const *pStage = &pCreateInfo->pStages[i];
         if (pStage->sType == VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) {
 
-            // always true; pStage->stage may be revived in a later revision and
-            // this will make sense again
-            if ((VK_SHADER_STAGE_VERTEX_BIT & (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT
+            if ((pStage->stage & (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT
                                   | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)) == 0) {
                 if (log_msg(my_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE, /*dev*/0, 0, SHADER_CHECKER_UNKNOWN_STAGE, "SC",
-                        "Unknown shader stage %d", VK_SHADER_STAGE_VERTEX_BIT)) {
+                        "Unknown shader stage %d", pStage->stage)) {
                     pass = false;
                 }
             }
             else {
-                struct shader_object *shader = my_data->shader_object_map[pStage->shader];
-                shaders[get_shader_stage_id(shader->stage)] = shader->module;
+                shader_module *module = my_data->shader_module_map[pStage->module];
+                shaders[get_shader_stage_id(pStage->stage)] = module;
 
                 /* validate descriptor set layout against what the spirv module actually uses */
                 std::map<std::pair<unsigned, unsigned>, interface_var> descriptor_uses;
-                collect_interface_by_descriptor_slot(my_data, dev, shader->module, spv::StorageClassUniform,
+                collect_interface_by_descriptor_slot(my_data, dev, module, spv::StorageClassUniform,
                         descriptor_uses);
 
                 auto layout = pCreateInfo->layout != VK_NULL_HANDLE ?
@@ -1082,7 +1050,7 @@
 
                     if (binding == nullptr) {
                         char type_name[1024];
-                        describe_type(type_name, shader->module, it->second.type_id);
+                        describe_type(type_name, module, it->second.type_id);
                         if (log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE, /*dev*/0, 0,
                                 SHADER_CHECKER_MISSING_DESCRIPTOR, "SC",
                                 "Shader uses descriptor slot %u.%u (used as type `%s`) but not declared in pipeline layout",
@@ -1280,7 +1248,6 @@
 
     ADD_HOOK(vkCreateDevice);
     ADD_HOOK(vkCreateShaderModule);
-    ADD_HOOK(vkCreateShader);
     ADD_HOOK(vkCreateRenderPass);
     ADD_HOOK(vkDestroyDevice);
     ADD_HOOK(vkCreateGraphicsPipelines);