vk/meta: Add a magic GLSL shader source macro
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 14 May 2015 18:58:58 +0000 (11:58 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 15 May 2015 02:07:34 +0000 (19:07 -0700)
src/vulkan/glsl_helpers.h [new file with mode: 0644]
src/vulkan/meta.c

diff --git a/src/vulkan/glsl_helpers.h b/src/vulkan/glsl_helpers.h
new file mode 100644 (file)
index 0000000..5288be5
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2015 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#define GLSL_VK_SHADER(device, stage, ...) ({                           \
+   VkShader __shader;                                                   \
+   const char __src[] = "#version 330\n" STRINGIFY((__ARGV__));         \
+   VkShaderCreateInfo __shader_create_info = {                          \
+      .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,                    \
+      .codeSize = sizeof(__src),                                        \
+      .pCode = __src,                                                   \
+      .flags = (1 << 31) /* GLSL back-door hack */                      \
+   };                                                                   \
+   vkCreateShader((VkDevice) device, &__shader_create_info, &__shader); \
+   __shader;                                                            \
+})
index e225da75b243afd90eec746dbca393a5a79d7bf6..d39cba4ea42b722e1a280ba41d3046deea9c0473 100644 (file)
@@ -28,8 +28,7 @@
 #include <fcntl.h>
 
 #include "private.h"
-
-#define GLSL(src) "#version 330\n" #src
+#include "glsl_helpers.h"
 
 static void
 anv_device_init_meta_clear_state(struct anv_device *device)
@@ -45,23 +44,14 @@ anv_device_init_meta_clear_state(struct anv_device *device)
    /* We don't use a vertex shader for clearing, but instead build and pass
     * the VUEs directly to the rasterization backend.
     */
-   static const char fs_source[] = GLSL(
+   VkShader fs = GLSL_VK_SHADER(device, FRAGMENT,
       out vec4 f_color;
       flat in vec4 v_color;
       void main()
       {
          f_color = v_color;
-      });
-
-   VkShader fs;
-   vkCreateShader((VkDevice) device,
-                  &(VkShaderCreateInfo) {
-                     .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
-                     .codeSize = sizeof(fs_source),
-                     .pCode = fs_source,
-                     .flags = 0
-                  },
-                  &fs);
+      }
+   );
 
    VkPipelineShaderStageCreateInfo fs_create_info = {
       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
@@ -300,7 +290,7 @@ anv_device_init_meta_blit_state(struct anv_device *device)
     * to provide GLSL source for the vertex shader so that the compiler
     * does not dead-code our inputs.
     */
-   static const char vs_source[] = GLSL(
+   VkShader vs = GLSL_VK_SHADER(device, VERTEX,
       in vec2 a_pos;
       in vec2 a_tex_coord;
       out vec4 v_tex_coord;
@@ -311,7 +301,7 @@ anv_device_init_meta_blit_state(struct anv_device *device)
       }
    );
 
-   static const char fs_source[] = GLSL(
+   VkShader fs = GLSL_VK_SHADER(device, FRAGMENT,
       out vec4 f_color;
       in vec4 v_tex_coord;
       layout(set = 0, index = 0) uniform sampler2D u_tex;
@@ -321,26 +311,6 @@ anv_device_init_meta_blit_state(struct anv_device *device)
       }
    );
 
-   VkShader vs;
-   vkCreateShader((VkDevice) device,
-                  &(VkShaderCreateInfo) {
-                     .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
-                     .codeSize = sizeof(vs_source),
-                     .pCode = vs_source,
-                     .flags = 0
-                  },
-                  &vs);
-
-   VkShader fs;
-   vkCreateShader((VkDevice) device,
-                  &(VkShaderCreateInfo) {
-                     .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO,
-                     .codeSize = sizeof(fs_source),
-                     .pCode = fs_source,
-                     .flags = 0
-                  },
-                  &fs);
-
    VkPipelineShaderStageCreateInfo vs_create_info = {
       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
       .pNext = &ia_create_info,