vk/meta: Add a magic GLSL shader source macro

This commit is contained in:
Jason Ekstrand 2015-05-14 11:58:58 -07:00
parent 018a0c1741
commit 79ace6def6
2 changed files with 43 additions and 36 deletions

37
src/vulkan/glsl_helpers.h Normal file
View file

@ -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; \
})

View 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,