From: Jason Ekstrand Date: Thu, 14 May 2015 18:58:58 +0000 (-0700) Subject: vk/meta: Add a magic GLSL shader source macro X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=79ace6def603f235b40f5df16f5d88dd6fb4c4d5;p=mesa.git vk/meta: Add a magic GLSL shader source macro --- diff --git a/src/vulkan/glsl_helpers.h b/src/vulkan/glsl_helpers.h new file mode 100644 index 00000000000..5288be56a20 --- /dev/null +++ b/src/vulkan/glsl_helpers.h @@ -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; \ +}) diff --git a/src/vulkan/meta.c b/src/vulkan/meta.c index e225da75b24..d39cba4ea42 100644 --- a/src/vulkan/meta.c +++ b/src/vulkan/meta.c @@ -28,8 +28,7 @@ #include #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,