diff options
| author | Cody Northrop <cody@lunarg.com> | 2015-05-28 11:27:16 -0600 |
|---|---|---|
| committer | Cody Northrop <cody@lunarg.com> | 2015-06-17 14:30:24 -0600 |
| commit | 1fedb21c1cb9470395126cbb00b6504fdd7be4a7 (patch) | |
| tree | c0f80eeed5849b72bfb21453d5b46944932f49f4 | |
| parent | 0f79c2c782b515d43b3d2e0519f71ddfef3e1607 (diff) | |
| download | usermoji-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.txt | 40 | ||||
| -rw-r--r-- | demos/cube.c | 174 | ||||
| -rw-r--r-- | demos/tri.c | 125 | ||||
| -rw-r--r-- | demos/tri.frag | 12 | ||||
| -rw-r--r-- | demos/tri.vert | 13 |
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; +} |
