From 78c9a806000bae40d4da0890efb03cc884c8f054 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 11 May 2016 19:39:38 +0200 Subject: [PATCH 1/2] Make test_shaders.py more robust with out-of-tree builds. Previous assumed that test script was run from root folder. This doesn't work with out-of-tree builds. --- test_shaders.py | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/test_shaders.py b/test_shaders.py index 4ce64758..6ca00ab7 100755 --- a/test_shaders.py +++ b/test_shaders.py @@ -78,13 +78,14 @@ def cross_compile(shader, vulkan): subprocess.check_call(['glslangValidator', '-V' if vulkan else '-G', '-o', spirv_path, shader]) - subprocess.check_call(['./spirv-cross', '--output', glsl_path, spirv_path]) + spirv_cross_path = './spirv-cross' + subprocess.check_call([spirv_cross_path, '--output', glsl_path, spirv_path]) if not ('nocompat' in glsl_path): validate_shader(glsl_path, False) if vulkan: - subprocess.check_call(['./spirv-cross', '--vulkan-semantics', '--output', vulkan_glsl_path, spirv_path]) + subprocess.check_call([spirv_cross_path, '--vulkan-semantics', '--output', vulkan_glsl_path, spirv_path]) validate_shader(vulkan_glsl_path, vulkan) return (spirv_path, glsl_path, vulkan_glsl_path if vulkan else None) @@ -101,8 +102,17 @@ def make_reference_dir(path): if not os.path.exists(base): os.makedirs(base) +def reference_path(directory, relpath): + split_paths = os.path.split(directory) + reference_dir = os.path.join(split_paths[0], 'reference/') + reference_dir = os.path.join(reference_dir, split_paths[1]) + return os.path.join(reference_dir, relpath) + def regression_check(shader, glsl, update, keep): - reference = os.path.join('./reference', shader) + reference = reference_path(shader[0], shader[1]) + joined_path = os.path.join(shader[0], shader[1]) + print('Reference shader path:', reference) + if os.path.exists(reference): if md5_for_file(glsl) != md5_for_file(reference): if update: @@ -121,46 +131,49 @@ def regression_check(shader, glsl, update, keep): else: os.remove(glsl) else: - print('Found new shader {}. Placing GLSL in {}'.format(shader, reference)) + print('Found new shader {}. Placing GLSL in {}'.format(joined_path, reference)) make_reference_dir(reference) shutil.move(glsl, reference) def test_shader(stats, shader, update, keep, vulkan): - print('Testing shader:', shader) - spirv, glsl, vulkan_glsl = cross_compile(shader, vulkan) + joined_path = os.path.join(shader[0], shader[1]) + + print('Testing shader:', joined_path) + spirv, glsl, vulkan_glsl = cross_compile(joined_path, vulkan) if stats: cross_stats = get_shader_stats(glsl) regression_check(shader, glsl, update, keep) if vulkan_glsl: - regression_check(shader + '.vk', vulkan_glsl, update, keep) + regression_check((shader[0], shader[1] + '.vk'), vulkan_glsl, update, keep) os.remove(spirv) if stats: - pristine_stats = get_shader_stats(shader) + pristine_stats = get_shader_stats(joined_path) a = [] - a.append(shader) + a.append(shader[1]) for i in pristine_stats: a.append(str(i)) for i in cross_stats: a.append(str(i)) print(','.join(a), file = stats) +def test_shaders_helper(stats, shader_dir, update, malisc, keep, vulkan): + for root, dirs, files in os.walk(os.path.join(shader_dir)): + for i in files: + path = os.path.join(root, i) + relpath = os.path.relpath(path, shader_dir) + test_shader(stats, (shader_dir, relpath), update, keep, vulkan) + def test_shaders(shader_dir, update, malisc, keep, vulkan): if malisc: with open('stats.csv', 'w') as stats: print('Shader,OrigRegs,OrigUniRegs,OrigALUShort,OrigLSShort,OrigTEXShort,OrigALULong,OrigLSLong,OrigTEXLong,CrossRegs,CrossUniRegs,CrossALUShort,CrossLSShort,CrossTEXShort,CrossALULong,CrossLSLong,CrossTEXLong', file = stats) - for f in os.walk(os.path.join(shader_dir)): - for i in f[2]: - shader = os.path.join(f[0], i) - test_shader(stats, shader, update, keep, vulkan) + test_shaders_helper(stats, shader_dir, update, malisc, keep, vulkan) else: - for f in os.walk(os.path.join(shader_dir)): - for i in f[2]: - shader = os.path.join(f[0], i) - test_shader(None, shader, update, keep, vulkan) + test_shaders_helper(None, shader_dir, update, malisc, keep, vulkan) def main(): parser = argparse.ArgumentParser(description = 'Script for regression testing.') From 8869a167d6c5a0728103725bba914c795416aced Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 11 May 2016 19:55:57 +0200 Subject: [PATCH 2/2] Drop --vulkan flag to test_shaders.py We can infer shader types from file extensions. --- CMakeLists.txt | 6 +---- .../vulkan/frag/input-attachment.vk.frag} | 0 .../vulkan/frag/input-attachment.vk.frag.vk} | 0 .../vulkan}/frag/push-constant.frag.vk | 0 .../vulkan/frag/push-constant.vk.frag} | 0 .../vulkan/frag/push-constant.vk.frag.vk | 18 +++++++++++++ ...separate-sampler-texture.nocompat.vk.frag} | 0 ...arate-sampler-texture.nocompat.vk.frag.vk} | 0 .../vulkan}/vert/vulkan-vertex.vert | 0 .../vulkan}/vert/vulkan-vertex.vert.vk | 0 .../shaders/vulkan/vert/vulkan-vertex.vk.vert | 9 +++++++ .../vulkan/vert/vulkan-vertex.vk.vert.vk | 7 +++++ .../vulkan/frag/input-attachment.vk.frag | 0 .../vulkan/frag/push-constant.vk.frag | 0 .../separate-sampler-texture.nocompat.vk.frag | 0 .../vulkan/vert/vulkan-vertex.vk.vert | 0 test_shaders.py | 27 ++++++++++--------- 17 files changed, 50 insertions(+), 17 deletions(-) rename reference/{shaders-vulkan/frag/input-attachment.frag => shaders/vulkan/frag/input-attachment.vk.frag} (100%) rename reference/{shaders-vulkan/frag/input-attachment.frag.vk => shaders/vulkan/frag/input-attachment.vk.frag.vk} (100%) rename reference/{shaders-vulkan => shaders/vulkan}/frag/push-constant.frag.vk (100%) rename reference/{shaders-vulkan/frag/push-constant.frag => shaders/vulkan/frag/push-constant.vk.frag} (100%) create mode 100644 reference/shaders/vulkan/frag/push-constant.vk.frag.vk rename reference/{shaders-vulkan/frag/separate-sampler-texture.nocompat.frag => shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag} (100%) rename reference/{shaders-vulkan/frag/separate-sampler-texture.nocompat.frag.vk => shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag.vk} (100%) rename reference/{shaders-vulkan => shaders/vulkan}/vert/vulkan-vertex.vert (100%) rename reference/{shaders-vulkan => shaders/vulkan}/vert/vulkan-vertex.vert.vk (100%) create mode 100644 reference/shaders/vulkan/vert/vulkan-vertex.vk.vert create mode 100644 reference/shaders/vulkan/vert/vulkan-vertex.vk.vert.vk rename shaders-vulkan/frag/input-attachment.frag => shaders/vulkan/frag/input-attachment.vk.frag (100%) rename shaders-vulkan/frag/push-constant.frag => shaders/vulkan/frag/push-constant.vk.frag (100%) rename shaders-vulkan/frag/separate-sampler-texture.nocompat.frag => shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag (100%) rename shaders-vulkan/vert/vulkan-vertex.vert => shaders/vulkan/vert/vulkan-vertex.vk.vert (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6f052711..103ce52f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,11 +55,7 @@ find_program(PYTHON3_EXE python3) if(${PYTHON3_EXE} MATCHES "NOTFOUND") message(WARNING "Testing disabled. Could not find python3") else() - add_test(NAME spirv-cross-opengl-test + add_test(NAME spirv-cross-test COMMAND ${PYTHON3_EXE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py ${CMAKE_CURRENT_SOURCE_DIR}/shaders) - add_test(NAME spirv-cross-vulkan-test - COMMAND ${PYTHON3_EXE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py - --vulkan - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-vulkan) endif() diff --git a/reference/shaders-vulkan/frag/input-attachment.frag b/reference/shaders/vulkan/frag/input-attachment.vk.frag similarity index 100% rename from reference/shaders-vulkan/frag/input-attachment.frag rename to reference/shaders/vulkan/frag/input-attachment.vk.frag diff --git a/reference/shaders-vulkan/frag/input-attachment.frag.vk b/reference/shaders/vulkan/frag/input-attachment.vk.frag.vk similarity index 100% rename from reference/shaders-vulkan/frag/input-attachment.frag.vk rename to reference/shaders/vulkan/frag/input-attachment.vk.frag.vk diff --git a/reference/shaders-vulkan/frag/push-constant.frag.vk b/reference/shaders/vulkan/frag/push-constant.frag.vk similarity index 100% rename from reference/shaders-vulkan/frag/push-constant.frag.vk rename to reference/shaders/vulkan/frag/push-constant.frag.vk diff --git a/reference/shaders-vulkan/frag/push-constant.frag b/reference/shaders/vulkan/frag/push-constant.vk.frag similarity index 100% rename from reference/shaders-vulkan/frag/push-constant.frag rename to reference/shaders/vulkan/frag/push-constant.vk.frag diff --git a/reference/shaders/vulkan/frag/push-constant.vk.frag.vk b/reference/shaders/vulkan/frag/push-constant.vk.frag.vk new file mode 100644 index 00000000..748a0286 --- /dev/null +++ b/reference/shaders/vulkan/frag/push-constant.vk.frag.vk @@ -0,0 +1,18 @@ +#version 310 es +precision mediump float; +precision highp int; + +layout(push_constant, std430) uniform PushConstants +{ + vec4 value0; + vec4 value1; +} push; + +layout(location = 0) out vec4 FragColor; +layout(location = 0) in vec4 vColor; + +void main() +{ + FragColor = ((vColor + push.value0) + push.value1); +} + diff --git a/reference/shaders-vulkan/frag/separate-sampler-texture.nocompat.frag b/reference/shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag similarity index 100% rename from reference/shaders-vulkan/frag/separate-sampler-texture.nocompat.frag rename to reference/shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag diff --git a/reference/shaders-vulkan/frag/separate-sampler-texture.nocompat.frag.vk b/reference/shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag.vk similarity index 100% rename from reference/shaders-vulkan/frag/separate-sampler-texture.nocompat.frag.vk rename to reference/shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag.vk diff --git a/reference/shaders-vulkan/vert/vulkan-vertex.vert b/reference/shaders/vulkan/vert/vulkan-vertex.vert similarity index 100% rename from reference/shaders-vulkan/vert/vulkan-vertex.vert rename to reference/shaders/vulkan/vert/vulkan-vertex.vert diff --git a/reference/shaders-vulkan/vert/vulkan-vertex.vert.vk b/reference/shaders/vulkan/vert/vulkan-vertex.vert.vk similarity index 100% rename from reference/shaders-vulkan/vert/vulkan-vertex.vert.vk rename to reference/shaders/vulkan/vert/vulkan-vertex.vert.vk diff --git a/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert b/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert new file mode 100644 index 00000000..8de2b111 --- /dev/null +++ b/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert @@ -0,0 +1,9 @@ +#version 310 es + +uniform int SPIRV_Cross_BaseInstance; + +void main() +{ + gl_Position = (vec4(1.0, 2.0, 3.0, 4.0) * float((gl_VertexID + (gl_InstanceID + SPIRV_Cross_BaseInstance)))); +} + diff --git a/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert.vk b/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert.vk new file mode 100644 index 00000000..9ee3cc09 --- /dev/null +++ b/reference/shaders/vulkan/vert/vulkan-vertex.vk.vert.vk @@ -0,0 +1,7 @@ +#version 310 es + +void main() +{ + gl_Position = (vec4(1.0, 2.0, 3.0, 4.0) * float((gl_VertexIndex + gl_InstanceIndex))); +} + diff --git a/shaders-vulkan/frag/input-attachment.frag b/shaders/vulkan/frag/input-attachment.vk.frag similarity index 100% rename from shaders-vulkan/frag/input-attachment.frag rename to shaders/vulkan/frag/input-attachment.vk.frag diff --git a/shaders-vulkan/frag/push-constant.frag b/shaders/vulkan/frag/push-constant.vk.frag similarity index 100% rename from shaders-vulkan/frag/push-constant.frag rename to shaders/vulkan/frag/push-constant.vk.frag diff --git a/shaders-vulkan/frag/separate-sampler-texture.nocompat.frag b/shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag similarity index 100% rename from shaders-vulkan/frag/separate-sampler-texture.nocompat.frag rename to shaders/vulkan/frag/separate-sampler-texture.nocompat.vk.frag diff --git a/shaders-vulkan/vert/vulkan-vertex.vert b/shaders/vulkan/vert/vulkan-vertex.vk.vert similarity index 100% rename from shaders-vulkan/vert/vulkan-vertex.vert rename to shaders/vulkan/vert/vulkan-vertex.vk.vert diff --git a/test_shaders.py b/test_shaders.py index 6ca00ab7..099b0373 100755 --- a/test_shaders.py +++ b/test_shaders.py @@ -81,6 +81,7 @@ def cross_compile(shader, vulkan): spirv_cross_path = './spirv-cross' subprocess.check_call([spirv_cross_path, '--output', glsl_path, spirv_path]) + # A shader might not be possible to make valid GLSL from, skip validation for this case. if not ('nocompat' in glsl_path): validate_shader(glsl_path, False) @@ -135,13 +136,18 @@ def regression_check(shader, glsl, update, keep): make_reference_dir(reference) shutil.move(glsl, reference) -def test_shader(stats, shader, update, keep, vulkan): +def shader_is_vulkan(shader): + return '.vk.' in shader + +def test_shader(stats, shader, update, keep): joined_path = os.path.join(shader[0], shader[1]) + vulkan = shader_is_vulkan(shader[1]) print('Testing shader:', joined_path) spirv, glsl, vulkan_glsl = cross_compile(joined_path, vulkan) - if stats: + # Only test GLSL stats if we have a shader following GL semantics. + if stats and (not vulkan): cross_stats = get_shader_stats(glsl) regression_check(shader, glsl, update, keep) @@ -149,7 +155,7 @@ def test_shader(stats, shader, update, keep, vulkan): regression_check((shader[0], shader[1] + '.vk'), vulkan_glsl, update, keep) os.remove(spirv) - if stats: + if stats and (not vulkan): pristine_stats = get_shader_stats(joined_path) a = [] @@ -160,20 +166,20 @@ def test_shader(stats, shader, update, keep, vulkan): a.append(str(i)) print(','.join(a), file = stats) -def test_shaders_helper(stats, shader_dir, update, malisc, keep, vulkan): +def test_shaders_helper(stats, shader_dir, update, malisc, keep): for root, dirs, files in os.walk(os.path.join(shader_dir)): for i in files: path = os.path.join(root, i) relpath = os.path.relpath(path, shader_dir) - test_shader(stats, (shader_dir, relpath), update, keep, vulkan) + test_shader(stats, (shader_dir, relpath), update, keep) -def test_shaders(shader_dir, update, malisc, keep, vulkan): +def test_shaders(shader_dir, update, malisc, keep): if malisc: with open('stats.csv', 'w') as stats: print('Shader,OrigRegs,OrigUniRegs,OrigALUShort,OrigLSShort,OrigTEXShort,OrigALULong,OrigLSLong,OrigTEXLong,CrossRegs,CrossUniRegs,CrossALUShort,CrossLSShort,CrossTEXShort,CrossALULong,CrossLSLong,CrossTEXLong', file = stats) - test_shaders_helper(stats, shader_dir, update, malisc, keep, vulkan) + test_shaders_helper(stats, shader_dir, update, malisc, keep) else: - test_shaders_helper(None, shader_dir, update, malisc, keep, vulkan) + test_shaders_helper(None, shader_dir, update, malisc, keep) def main(): parser = argparse.ArgumentParser(description = 'Script for regression testing.') @@ -188,16 +194,13 @@ def main(): parser.add_argument('--malisc', action = 'store_true', help = 'Use malisc offline compiler to determine static cycle counts before and after spirv-cross.') - parser.add_argument('--vulkan', - action = 'store_true', - help = 'Test shaders using Vulkan semantics instead of OpenGL.') args = parser.parse_args() if not args.folder: sys.stderr.write('Need shader folder.\n') sys.exit(1) - test_shaders(args.folder, args.update, args.malisc, args.keep, args.vulkan) + test_shaders(args.folder, args.update, args.malisc, args.keep) if args.malisc: print('Stats in stats.csv!') print('Tests completed!')