From 51884155eef1517f69b804a42a879c433777b0a1 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 15 Feb 2019 14:16:58 -0800 Subject: [PATCH] Support Android app-specific extensions in shaders --- cmake/macros/AutoScribeShader.cmake | 11 ++++++ libraries/shaders/headers/310es/header.glsl | 5 +-- libraries/shaders/headers/310es/version.glsl | 3 ++ libraries/shaders/headers/410/header.glsl | 2 - libraries/shaders/headers/410/version.glsl | 2 + libraries/shaders/headers/450/header.glsl | 2 - libraries/shaders/headers/450/version.glsl | 2 + tools/shadergen.py | 39 +++++++++++++++++--- 8 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 libraries/shaders/headers/310es/version.glsl create mode 100644 libraries/shaders/headers/410/version.glsl create mode 100644 libraries/shaders/headers/450/version.glsl diff --git a/cmake/macros/AutoScribeShader.cmake b/cmake/macros/AutoScribeShader.cmake index 64fbcc4ea6..b56b3f8eea 100755 --- a/cmake/macros/AutoScribeShader.cmake +++ b/cmake/macros/AutoScribeShader.cmake @@ -270,6 +270,16 @@ macro(AUTOSCRIBE_SHADER_LIBS) set(AUTOSCRIBE_SHADERGEN_COMMANDS_FILE ${CMAKE_CURRENT_BINARY_DIR}/shadergen.txt) file(WRITE ${AUTOSCRIBE_SHADERGEN_COMMANDS_FILE} "${AUTOSCRIBE_SHADERGEN_COMMANDS}") + if (HIFI_ANDROID) + if ( + (${HIFI_ANDROID_APP} STREQUAL "questInterface") OR + (${HIFI_ANDROID_APP} STREQUAL "questFramePlayer") OR + (${HIFI_ANDROID_APP} STREQUAL "framePlayer") + ) + set(EXTRA_SHADERGEN_ARGS "--extensions EXT_clip_cull_distance") + endif() + endif() + # A custom python script which will generate all our shader artifacts add_custom_command( OUTPUT ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS} @@ -279,6 +289,7 @@ macro(AUTOSCRIBE_SHADER_LIBS) --tools-dir ${VCPKG_TOOLS_DIR} --build-dir ${CMAKE_CURRENT_BINARY_DIR} --source-dir ${CMAKE_SOURCE_DIR} + ${EXTRA_SHADERGEN_ARGS} DEPENDS ${AUTOSCRIBE_SHADER_HEADERS} ${CMAKE_SOURCE_DIR}/tools/shadergen.py ${ALL_SCRIBE_SHADERS}) add_custom_target(shadergen DEPENDS ${SCRIBED_SHADERS} ${SPIRV_SHADERS} ${REFLECTED_SHADERS}) diff --git a/libraries/shaders/headers/310es/header.glsl b/libraries/shaders/headers/310es/header.glsl index f98aed7659..a21b2ec5d6 100644 --- a/libraries/shaders/headers/310es/header.glsl +++ b/libraries/shaders/headers/310es/header.glsl @@ -1,6 +1,3 @@ -#version 310 es -#define GPU_GLES -#define GPU_GLES_310 #define BITFIELD highp int #define LAYOUT(X) layout(X) #define LAYOUT_STD140(X) layout(std140, X) @@ -9,7 +6,7 @@ #define gl_VertexID gl_VertexIndex #endif #extension GL_EXT_texture_buffer : enable -#ifndef VULKAN +#if defined(HAVE_EXT_clip_cull_distance) && !defined(VULKAN) #extension GL_EXT_clip_cull_distance : enable #endif precision highp float; diff --git a/libraries/shaders/headers/310es/version.glsl b/libraries/shaders/headers/310es/version.glsl new file mode 100644 index 0000000000..52e5edea8b --- /dev/null +++ b/libraries/shaders/headers/310es/version.glsl @@ -0,0 +1,3 @@ +#version 310 es +#define GPU_GLES +#define GPU_GLES_310 diff --git a/libraries/shaders/headers/410/header.glsl b/libraries/shaders/headers/410/header.glsl index 901ae6f9db..20bd6b2505 100644 --- a/libraries/shaders/headers/410/header.glsl +++ b/libraries/shaders/headers/410/header.glsl @@ -1,5 +1,3 @@ -#version 410 core -#define GPU_GL410 #define BITFIELD int #if defined(VULKAN) #extension GL_ARB_shading_language_420pack : require diff --git a/libraries/shaders/headers/410/version.glsl b/libraries/shaders/headers/410/version.glsl new file mode 100644 index 0000000000..01ab7e5398 --- /dev/null +++ b/libraries/shaders/headers/410/version.glsl @@ -0,0 +1,2 @@ +#version 410 core +#define GPU_GL410 diff --git a/libraries/shaders/headers/450/header.glsl b/libraries/shaders/headers/450/header.glsl index 6ce61b4378..ef0ec09414 100644 --- a/libraries/shaders/headers/450/header.glsl +++ b/libraries/shaders/headers/450/header.glsl @@ -1,5 +1,3 @@ -#version 450 core -#define GPU_GL450 #define GPU_SSBO_TRANSFORM_OBJECT #define BITFIELD int #define LAYOUT(X) layout(X) diff --git a/libraries/shaders/headers/450/version.glsl b/libraries/shaders/headers/450/version.glsl new file mode 100644 index 0000000000..874d578bd9 --- /dev/null +++ b/libraries/shaders/headers/450/version.glsl @@ -0,0 +1,2 @@ +#version 450 core +#define GPU_GL450 diff --git a/tools/shadergen.py b/tools/shadergen.py index ffbe1662ec..f82b471f17 100644 --- a/tools/shadergen.py +++ b/tools/shadergen.py @@ -49,11 +49,36 @@ def getCommonScribeArgs(scribefile, includeLibs): scribeArgs.append(scribefile) return scribeArgs -def getDialectAndVariantHeaders(dialect, variant): +extensionsHeaderMutex = Lock() + +def getExtensionsHeader(dialect, variant, extensions): + extensionHeader = '{}/extensions_{}_{}.glsl'.format(args.build_dir, dialect, variant) + global extensionsHeaderMutex + extensionsHeaderMutex.acquire() + if not os.path.exists(extensionHeader): + extensionsDefines = [] + for extension in extensions: + extensionsDefines.append('#define HAVE_{}'.format(extension)) + # make sure we end with a line feed + extensionsDefines.append("\r\n") + with open(extensionHeader, "w") as f: + f.write('\r\n'.join(extensionsDefines)) + extensionsHeaderMutex.release() + return extensionHeader + + +def getDialectAndVariantHeaders(dialect, variant, extensions=None): + result = [] headerPath = args.source_dir + '/libraries/shaders/headers/' - variantHeader = headerPath + ('stereo.glsl' if (variant == 'stereo') else 'mono.glsl') + versionHeader = headerPath + dialect + '/version.glsl' + result.append(versionHeader) + if extensions is not None: + result.append(getExtensionsHeader(dialect, variant, extensions)) dialectHeader = headerPath + dialect + '/header.glsl' - return [dialectHeader, variantHeader] + result.append(dialectHeader) + variantHeader = headerPath + ('stereo.glsl' if (variant == 'stereo') else 'mono.glsl') + result.append(variantHeader) + return result class ScribeDependenciesCache: cache = {} @@ -170,7 +195,7 @@ def processCommand(line): scribeDepCache.gen(scribeFile, libs, dialect, variant) scribeArgs = getCommonScribeArgs(scribeFile, libs) - for header in getDialectAndVariantHeaders(dialect, variant): + for header in getDialectAndVariantHeaders(dialect, variant, args.extensions): scribeArgs.extend(['-H', header]) scribeArgs.extend(['-o', unoptGlslFile]) executeSubprocess(scribeArgs) @@ -218,6 +243,7 @@ def main(): parser = ArgumentParser(description='Generate shader artifacts.') +parser.add_argument('--extensions', type=str, nargs='*', help='Available extensions for the shaders') parser.add_argument('--commands', type=argparse.FileType('r'), help='list of commands to execute') parser.add_argument('--tools-dir', type=str, help='location of the host compatible binaries') parser.add_argument('--build-dir', type=str, help='The build directory base path') @@ -230,8 +256,8 @@ args = None if len(sys.argv) == 1: # for debugging sourceDir = expanduser('~/git/hifi') - toolsDir = os.path.join(expanduser('~/git/vcpkg'), 'installed', 'x64-windows', 'tools') - buildPath = sourceDir + '/build' + toolsDir = 'd:/hifi/vcpkg/android/fd82f0a8/installed/x64-windows/tools' + buildPath = sourceDir + '/build_android' commandsPath = buildPath + '/libraries/shaders/shadergen.txt' shaderDir = buildPath + '/libraries/shaders' testArgs = '--commands {} --tools-dir {} --build-dir {} --source-dir {}'.format( @@ -239,6 +265,7 @@ if len(sys.argv) == 1: ).split() testArgs.append('--debug') testArgs.append('--force') + testArgs.extend('--extensions EXT_clip_cull_distance'.split()) #testArgs.append('--dry-run') args = parser.parse_args(testArgs) else: