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/demos/cube.c b/demos/cube.c
index d550522..29c1c8e 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -1388,37 +1388,23 @@
     assert(!err);
 }
 
-static VkShader demo_prepare_shader(struct demo* demo,
-                                      VkShaderStageFlagBits stage,
-                                      VkShaderModule* pShaderModule,
-                                      const void* code,
-                                      size_t size)
+static VkShaderModule demo_prepare_shader_module(struct demo* demo,
+                                                 VkShaderStageFlagBits stage,
+                                                 const void* code,
+                                                 size_t size)
 {
+    VkShaderModule module;
     VkShaderModuleCreateInfo moduleCreateInfo;
-    VkShaderCreateInfo shaderCreateInfo;
-    VkShader shader;
     VkResult err;
 
-
     moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
     moduleCreateInfo.pNext = NULL;
 
-    shaderCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
-    shaderCreateInfo.pNext = NULL;
-    shaderCreateInfo.pName = "main";
-
     if (!demo->use_glsl) {
         moduleCreateInfo.codeSize = size;
         moduleCreateInfo.pCode = code;
         moduleCreateInfo.flags = 0;
-        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule);
-        assert(!err);
-
-        shaderCreateInfo.flags = 0;
-        shaderCreateInfo.module = *pShaderModule;
-        shaderCreateInfo.pName = "main";
-        shaderCreateInfo.stage = stage;
-        err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader);
+        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);
         assert(!err);
     } else {
         // Create fake SPV structure to feed GLSL
@@ -1433,20 +1419,12 @@
         ((uint32_t *) moduleCreateInfo.pCode)[2] = stage;
         memcpy(((uint32_t *) moduleCreateInfo.pCode + 3), code, size + 1);
 
-        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule);
-        if (err) {
-            free((void *) moduleCreateInfo.pCode);
-        }
-
-        shaderCreateInfo.flags = 0;
-        shaderCreateInfo.module = *pShaderModule;
-        shaderCreateInfo.pName = "main";
-        shaderCreateInfo.stage = stage;
-        err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader);
+        err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module);
         assert(!err);
         free((void *) moduleCreateInfo.pCode);
     }
-    return shader;
+
+    return module;
 }
 
 char *demo_read_spv(const char *filename, size_t *psize)
@@ -1473,19 +1451,16 @@
     return shader_code;
 }
 
-static VkShader demo_prepare_vs(struct demo *demo)
+static VkShaderModule demo_prepare_vs(struct demo *demo)
 {
     if (!demo->use_glsl) {
-        VkShader shader;
         void *vertShaderCode;
         size_t size;
 
         vertShaderCode = demo_read_spv("cube-vert.spv", &size);
-
-        shader = demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, &demo->vert_shader_module,
-                                     vertShaderCode, size);
+        demo->vert_shader_module = demo_prepare_shader_module(demo,
+                VK_SHADER_STAGE_VERTEX_BIT, vertShaderCode, size);
         free(vertShaderCode);
-        return shader;
     } else {
         static const char *vertShaderText =
                 "#version 140\n"
@@ -1510,25 +1485,25 @@
                 "   gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\n"
                 "}\n";
 
-        return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, &demo->vert_shader_module,
-                                   (const void *) vertShaderText,
-                                   strlen(vertShaderText));
+        demo->vert_shader_module = demo_prepare_shader_module(demo,
+                VK_SHADER_STAGE_VERTEX_BIT,
+                (const void *) vertShaderText, strlen(vertShaderText));
     }
+
+    return demo->vert_shader_module;
 }
 
-static VkShader demo_prepare_fs(struct demo *demo)
+static VkShaderModule demo_prepare_fs(struct demo *demo)
 {
     if (!demo->use_glsl) {
-        VkShader shader;
         void *fragShaderCode;
         size_t size;
 
         fragShaderCode = demo_read_spv("cube-frag.spv", &size);
 
-        shader = demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, &demo->frag_shader_module,
-                                     fragShaderCode, size);
+        demo->frag_shader_module = demo_prepare_shader_module(demo,
+                VK_SHADER_STAGE_FRAGMENT_BIT, fragShaderCode, size);
         free(fragShaderCode);
-        return shader;
     } else {
         static const char *fragShaderText =
                 "#version 140\n"
@@ -1542,10 +1517,12 @@
                 "   uFragColor = texture(tex, texcoord.xy);\n"
                 "}\n";
 
-        return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, &demo->frag_shader_module,
-                                   (const void *) fragShaderText,
-                                   strlen(fragShaderText));
+        demo->frag_shader_module = demo_prepare_shader_module(demo,
+                VK_SHADER_STAGE_FRAGMENT_BIT,
+                (const void *) fragShaderText, strlen(fragShaderText));
     }
+
+    return demo->frag_shader_module;
 }
 
 static void demo_prepare_pipeline(struct demo *demo)
@@ -1627,10 +1604,14 @@
     memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
 
     shaderStages[0].sType  = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
-    shaderStages[0].shader = demo_prepare_vs(demo);
+    shaderStages[0].stage  = VK_SHADER_STAGE_VERTEX_BIT;
+    shaderStages[0].module = demo_prepare_vs(demo);
+    shaderStages[0].pName  = "main";
 
     shaderStages[1].sType  = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
-    shaderStages[1].shader = demo_prepare_fs(demo);
+    shaderStages[1].stage  = VK_SHADER_STAGE_FRAGMENT_BIT;
+    shaderStages[1].module = demo_prepare_fs(demo);
+    shaderStages[1].pName  = "main";
 
     memset(&pipelineCache, 0, sizeof(pipelineCache));
     pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
@@ -1655,9 +1636,6 @@
             1, &pipeline, NULL, &demo->pipeline);
     assert(!err);
 
-    for (uint32_t i = 0; i < pipeline.stageCount; i++) {
-        vkDestroyShader(demo->device, shaderStages[i].shader, NULL);
-    }
     vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL);
     vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL);
 }