--- /dev/null
+/*
+ * 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; \
+})
#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)
/* 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,
* 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;
}
);
- 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;
}
);
- 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,