aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Northrop <cody@lunarg.com>2015-05-28 11:27:16 -0600
committerCody Northrop <cody@lunarg.com>2015-06-17 14:30:24 -0600
commit1fedb21c1cb9470395126cbb00b6504fdd7be4a7 (patch)
treec0f80eeed5849b72bfb21453d5b46944932f49f4
parent0f79c2c782b515d43b3d2e0519f71ddfef3e1607 (diff)
downloadusermoji-1fedb21c1cb9470395126cbb00b6504fdd7be4a7.tar.xz
demos: Add --use_glsl option for GLSL, use SPIR-V by default.
Previously required a define in CMake. Since we have multiple drivers and vendors that would like to test both, make it a command line option.
-rw-r--r--demos/CMakeLists.txt40
-rw-r--r--demos/cube.c174
-rw-r--r--demos/tri.c125
-rw-r--r--demos/tri.frag12
-rw-r--r--demos/tri.vert13
5 files changed, 239 insertions, 125 deletions
diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt
index ba2b5a54..27d21c0f 100644
--- a/demos/CMakeLists.txt
+++ b/demos/CMakeLists.txt
@@ -19,11 +19,41 @@ file(COPY ${TEXTURES} DESTINATION ${CMAKE_BINARY_DIR}/demos)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES")
+set (LIBRARIES "vulkan")
+
if(WIN32)
- set (LIBRARIES "vulkan")
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-vert.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/tri.vert
+ COMMAND move vert.spv ${CMAKE_BINARY_DIR}/demos/tri-vert.spv
+ DEPENDS tri.vert ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-frag.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/tri.frag
+ COMMAND move frag.spv ${CMAKE_BINARY_DIR}/demos/tri-frag.spv
+ DEPENDS tri.frag ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/cube-vert.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/cube.vert
+ COMMAND move vert.spv ${CMAKE_BINARY_DIR}/demos/cube-vert.spv
+ DEPENDS cube.vert ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/cube-frag.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/cube.frag
+ COMMAND move frag.spv ${CMAKE_BINARY_DIR}/demos/cube-frag.spv
+ DEPENDS cube.frag ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
endif()
if(NOT WIN32)
- set (LIBRARIES "vulkan")
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-vert.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/tri.vert
+ COMMAND mv vert.spv ${CMAKE_BINARY_DIR}/demos/tri-vert.spv
+ DEPENDS tri.vert ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-frag.spv
+ COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/tri.frag
+ COMMAND mv frag.spv ${CMAKE_BINARY_DIR}/demos/tri-frag.spv
+ DEPENDS tri.frag ${GLSLANG_PREFIX}/build/install/bin/glslangValidator
+ )
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/cube-vert.spv
COMMAND ${GLSLANG_PREFIX}/build/install/bin/glslangValidator -s -V ${PROJECT_SOURCE_DIR}/demos/cube.vert
COMMAND mv vert.spv ${CMAKE_BINARY_DIR}/demos/cube-vert.spv
@@ -54,8 +84,6 @@ if(WIN32)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CRT_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES")
-else()
- set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DEXTERNAL_SPV")
endif()
if(UNIX)
@@ -66,9 +94,9 @@ endif()
target_link_libraries(vulkaninfo ${LIBRARIES})
if(UNIX)
- add_executable(tri tri.c)
+ add_executable(tri tri.c ${CMAKE_BINARY_DIR}/demos/tri-vert.spv ${CMAKE_BINARY_DIR}/demos/tri-frag.spv)
else()
- add_executable(tri WIN32 tri.c)
+ add_executable(tri WIN32 tri.c ${CMAKE_BINARY_DIR}/demos/tri-vert.spv ${CMAKE_BINARY_DIR}/demos/tri-frag.spv)
endif()
target_link_libraries(tri ${LIBRARIES})
diff --git a/demos/cube.c b/demos/cube.c
index f3afe056..765251d0 100644
--- a/demos/cube.c
+++ b/demos/cube.c
@@ -278,8 +278,9 @@ struct demo {
xcb_window_t window;
xcb_intern_atom_reply_t *atom_wm_delete_window;
#endif // _WIN32
- bool prepared;
+ bool prepared;
bool use_staging_buffer;
+ bool use_glsl;
VkInstance inst;
VkPhysicalDevice gpu;
@@ -1206,35 +1207,34 @@ static VkShader demo_prepare_shader(struct demo *demo,
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
createInfo.pNext = NULL;
-#ifdef EXTERNAL_SPV
- createInfo.codeSize = size;
- createInfo.pCode = code;
- createInfo.flags = 0;
+ if (!demo->use_glsl) {
+ createInfo.codeSize = size;
+ createInfo.pCode = code;
+ createInfo.flags = 0;
- err = vkCreateShader(demo->device, &createInfo, &shader);
- if (err) {
- free((void *) createInfo.pCode);
- }
-#else
- // Create fake SPV structure to feed GLSL
- // to the driver "under the covers"
- createInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
- createInfo.pCode = malloc(createInfo.codeSize);
- createInfo.flags = 0;
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) createInfo.pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) createInfo.pCode)[1] = 0;
- ((uint32_t *) createInfo.pCode)[2] = stage;
- memcpy(((uint32_t *) createInfo.pCode + 3), code, size + 1);
-
- err = vkCreateShader(demo->device, &createInfo, &shader);
- if (err) {
- free((void *) createInfo.pCode);
- return (VkShader) VK_NULL_HANDLE;
+ err = vkCreateShader(demo->device, &createInfo, &shader);
+ if (err) {
+ free((void *) createInfo.pCode);
+ }
+ } else {
+ // Create fake SPV structure to feed GLSL
+ // to the driver "under the covers"
+ createInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
+ createInfo.pCode = malloc(createInfo.codeSize);
+ createInfo.flags = 0;
+
+ /* try version 0 first: VkShaderStage followed by GLSL */
+ ((uint32_t *) createInfo.pCode)[0] = ICD_SPV_MAGIC;
+ ((uint32_t *) createInfo.pCode)[1] = 0;
+ ((uint32_t *) createInfo.pCode)[2] = stage;
+ memcpy(((uint32_t *) createInfo.pCode + 3), code, size + 1);
+
+ err = vkCreateShader(demo->device, &createInfo, &shader);
+ if (err) {
+ free((void *) createInfo.pCode);
+ return (VkShader) VK_NULL_HANDLE;
+ }
}
-#endif
-
return shader;
}
@@ -1263,71 +1263,71 @@ char *demo_read_spv(const char *filename, size_t *psize)
static VkShader demo_prepare_vs(struct demo *demo)
{
-#ifdef EXTERNAL_SPV
- void *vertShaderCode;
- size_t size;
+ if (!demo->use_glsl) {
+ void *vertShaderCode;
+ size_t size;
- vertShaderCode = demo_read_spv("cube-vert.spv", &size);
+ vertShaderCode = demo_read_spv("cube-vert.spv", &size);
- return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
- vertShaderCode, size);
-#else
- static const char *vertShaderText =
- "#version 140\n"
- "#extension GL_ARB_separate_shader_objects : enable\n"
- "#extension GL_ARB_shading_language_420pack : enable\n"
- "\n"
- "layout(binding = 0) uniform buf {\n"
- " mat4 MVP;\n"
- " vec4 position[12*3];\n"
- " vec4 attr[12*3];\n"
- "} ubuf;\n"
- "\n"
- "layout (location = 0) out vec4 texcoord;\n"
- "\n"
- "void main() \n"
- "{\n"
- " texcoord = ubuf.attr[gl_VertexID];\n"
- " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
- "\n"
- " // GL->VK conventions\n"
- " gl_Position.y = -gl_Position.y;\n"
- " gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\n"
- "}\n";
-
- return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
- (const void *) vertShaderText,
- strlen(vertShaderText));
-#endif
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
+ vertShaderCode, size);
+ } else {
+ static const char *vertShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "\n"
+ "layout(binding = 0) uniform buf {\n"
+ " mat4 MVP;\n"
+ " vec4 position[12*3];\n"
+ " vec4 attr[12*3];\n"
+ "} ubuf;\n"
+ "\n"
+ "layout (location = 0) out vec4 texcoord;\n"
+ "\n"
+ "void main() \n"
+ "{\n"
+ " texcoord = ubuf.attr[gl_VertexID];\n"
+ " gl_Position = ubuf.MVP * ubuf.position[gl_VertexID];\n"
+ "\n"
+ " // GL->VK conventions\n"
+ " gl_Position.y = -gl_Position.y;\n"
+ " gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\n"
+ "}\n";
+
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
+ (const void *) vertShaderText,
+ strlen(vertShaderText));
+ }
}
static VkShader demo_prepare_fs(struct demo *demo)
{
-#ifdef EXTERNAL_SPV
- void *fragShaderCode;
- size_t size;
+ if (!demo->use_glsl) {
+ void *fragShaderCode;
+ size_t size;
- fragShaderCode = demo_read_spv("cube-frag.spv", &size);
+ fragShaderCode = demo_read_spv("cube-frag.spv", &size);
- return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
- fragShaderCode, size);
-#else
- static const char *fragShaderText =
- "#version 140\n"
- "#extension GL_ARB_separate_shader_objects : enable\n"
- "#extension GL_ARB_shading_language_420pack : enable\n"
- "layout (binding = 1) uniform sampler2D tex;\n"
- "\n"
- "layout (location = 0) in vec4 texcoord;\n"
- "layout (location = 0) out vec4 uFragColor;\n"
- "void main() {\n"
- " uFragColor = texture(tex, texcoord.xy);\n"
- "}\n";
-
- return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
- (const void *) fragShaderText,
- strlen(fragShaderText));
-#endif
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
+ fragShaderCode, size);
+ } else {
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (binding = 1) uniform sampler2D tex;\n"
+ "\n"
+ "layout (location = 0) in vec4 texcoord;\n"
+ "layout (location = 0) out vec4 uFragColor;\n"
+ "void main() {\n"
+ " uFragColor = texture(tex, texcoord.xy);\n"
+ "}\n";
+
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
+ (const void *) fragShaderText,
+ strlen(fragShaderText));
+ }
}
static void demo_prepare_pipeline(struct demo *demo)
@@ -1985,6 +1985,10 @@ static void demo_init(struct demo *demo, int argc, char **argv)
demo->use_staging_buffer = true;
continue;
}
+ if (strcmp(argv[i], "--use_glsl") == 0) {
+ demo->use_glsl = true;
+ continue;
+ }
if (strcmp(argv[i], "--validate") == 0) {
demo->validate = true;
continue;
diff --git a/demos/tri.c b/demos/tri.c
index f9ee318e..4101cf96 100644
--- a/demos/tri.c
+++ b/demos/tri.c
@@ -105,6 +105,7 @@ struct demo {
#endif // _WIN32
bool prepared;
bool use_staging_buffer;
+ bool use_glsl;
VkInstance inst;
VkPhysicalDevice gpu;
@@ -840,30 +841,71 @@ static VkShader demo_prepare_shader(struct demo *demo,
createInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO;
createInfo.pNext = NULL;
- // Create fake SPV structure to feed GLSL
- // to the driver "under the covers"
- createInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
- createInfo.pCode = malloc(createInfo.codeSize);
- createInfo.flags = 0;
-
- /* try version 0 first: VkShaderStage followed by GLSL */
- ((uint32_t *) createInfo.pCode)[0] = ICD_SPV_MAGIC;
- ((uint32_t *) createInfo.pCode)[1] = 0;
- ((uint32_t *) createInfo.pCode)[2] = stage;
- memcpy(((uint32_t *) createInfo.pCode + 3), code, size + 1);
-
- err = vkCreateShader(demo->device, &createInfo, &shader);
- if (err) {
- free((void *) createInfo.pCode);
- return VK_NULL_HANDLE;
+ if (!demo->use_glsl) {
+ createInfo.codeSize = size;
+ createInfo.pCode = code;
+ createInfo.flags = 0;
+
+ err = vkCreateShader(demo->device, &createInfo, &shader);
+ if (err) {
+ free((void *)createInfo.pCode);
+ }
+ } else {
+ // Create fake SPV structure to feed GLSL
+ // to the driver "under the covers"
+ createInfo.codeSize = 3 * sizeof(uint32_t) + size + 1;
+ createInfo.pCode = malloc(createInfo.codeSize);
+ createInfo.flags = 0;
+
+ /* try version 0 first: VkShaderStage followed by GLSL */
+ ((uint32_t *) createInfo.pCode)[0] = ICD_SPV_MAGIC;
+ ((uint32_t *) createInfo.pCode)[1] = 0;
+ ((uint32_t *) createInfo.pCode)[2] = stage;
+ memcpy(((uint32_t *) createInfo.pCode + 3), code, size + 1);
+
+ err = vkCreateShader(demo->device, &createInfo, &shader);
+ if (err) {
+ free((void *) createInfo.pCode);
+ return VK_NULL_HANDLE;
+ }
}
return shader;
}
+char *demo_read_spv(const char *filename, size_t *psize)
+{
+ long int size;
+ void *shader_code;
+
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) return NULL;
+
+ fseek(fp, 0L, SEEK_END);
+ size = ftell(fp);
+
+ fseek(fp, 0L, SEEK_SET);
+
+ shader_code = malloc(size);
+ fread(shader_code, size, 1, fp);
+
+ *psize = size;
+
+ return shader_code;
+}
+
static VkShader demo_prepare_vs(struct demo *demo)
{
- static const char *vertShaderText =
+ if (!demo->use_glsl) {
+ void *vertShaderCode;
+ size_t size;
+
+ vertShaderCode = demo_read_spv("tri-vert.spv", &size);
+
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
+ vertShaderCode, size);
+ } else {
+ static const char *vertShaderText =
"#version 140\n"
"#extension GL_ARB_separate_shader_objects : enable\n"
"#extension GL_ARB_shading_language_420pack : enable\n"
@@ -875,27 +917,38 @@ static VkShader demo_prepare_vs(struct demo *demo)
" gl_Position = pos;\n"
"}\n";
- return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
- (const void *) vertShaderText,
- strlen(vertShaderText));
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX,
+ (const void *) vertShaderText,
+ strlen(vertShaderText));
+ }
}
static VkShader demo_prepare_fs(struct demo *demo)
{
- static const char *fragShaderText =
- "#version 140\n"
- "#extension GL_ARB_separate_shader_objects : enable\n"
- "#extension GL_ARB_shading_language_420pack : enable\n"
- "layout (binding = 0) uniform sampler2D tex;\n"
- "layout (location = 0) in vec2 texcoord;\n"
- "layout (location = 0) out vec4 uFragColor;\n"
- "void main() {\n"
- " uFragColor = texture(tex, texcoord);\n"
- "}\n";
-
- return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
- (const void *) fragShaderText,
- strlen(fragShaderText));
+ if (!demo->use_glsl) {
+ void *fragShaderCode;
+ size_t size;
+
+ fragShaderCode = demo_read_spv("tri-frag.spv", &size);
+
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
+ fragShaderCode, size);
+ } else {
+ static const char *fragShaderText =
+ "#version 140\n"
+ "#extension GL_ARB_separate_shader_objects : enable\n"
+ "#extension GL_ARB_shading_language_420pack : enable\n"
+ "layout (binding = 0) uniform sampler2D tex;\n"
+ "layout (location = 0) in vec2 texcoord;\n"
+ "layout (location = 0) out vec4 uFragColor;\n"
+ "void main() {\n"
+ " uFragColor = texture(tex, texcoord);\n"
+ "}\n";
+
+ return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT,
+ (const void *) fragShaderText,
+ strlen(fragShaderText));
+ }
}
static void demo_prepare_pipeline(struct demo *demo)
@@ -1488,6 +1541,8 @@ static void demo_init(struct demo *demo, const int argc, const char *argv[])
if (strncmp(pCmdLine, "--use_staging", strlen("--use_staging")) == 0)
demo->use_staging_buffer = true;
+ else if (strncmp(pCmdLine, "--use_glsl", strlen("--use_glsl")) == 0)
+ demo->use_glsl = true;
else if (strlen(pCmdLine) != 0) {
fprintf(stderr, "Do not recognize argument \"%s\".\n", pCmdLine);
argv_error = true;
@@ -1496,6 +1551,8 @@ static void demo_init(struct demo *demo, const int argc, const char *argv[])
for (int i = 0; i < argc; i++) {
if (strncmp(argv[i], "--use_staging", strlen("--use_staging")) == 0)
demo->use_staging_buffer = true;
+ else if (strncmp(argv[i], "--use_glsl", strlen("--use_glsl")) == 0)
+ demo->use_glsl = true;
}
#endif // _WIN32
if (argv_error) {
diff --git a/demos/tri.frag b/demos/tri.frag
new file mode 100644
index 00000000..7672fb72
--- /dev/null
+++ b/demos/tri.frag
@@ -0,0 +1,12 @@
+/*
+ * Fragment shader for tri demo
+ */
+#version 140
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_ARB_shading_language_420pack : enable
+layout (binding = 0) uniform sampler2D tex;
+layout (location = 0) in vec2 texcoord;
+layout (location = 0) out vec4 uFragColor;
+void main() {
+ uFragColor = texture(tex, texcoord);
+}
diff --git a/demos/tri.vert b/demos/tri.vert
new file mode 100644
index 00000000..928aa4bb
--- /dev/null
+++ b/demos/tri.vert
@@ -0,0 +1,13 @@
+/*
+ * Vertex shader used by tri demo.
+ */
+#version 140
+#extension GL_ARB_separate_shader_objects : enable
+#extension GL_ARB_shading_language_420pack : enable
+layout (location = 0) in vec4 pos;
+layout (location = 1) in vec2 attr;
+out vec2 texcoord;
+void main() {
+ texcoord = attr;
+ gl_Position = pos;
+}