This essentially reverts b5a52577781ff191766f49866ce00af749cb86b7, but it seems that glslangValidator has since become a little more friendly. Additionally, I used python tempfile module to simplify creating tempfiles with the required extensions.
One reason to revert to using glslangValidator is just to remove the additional shaderc/glslc dependency. An advantage of using glslangValidator is that the SPIR-V binary and assembly code can be generated with a single invocation of glslangValidator. Cc: Jason Ekstrand <ja...@jlekstrand.net> Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> --- INSTALL | 2 +- Makefile.am | 2 +- configure.ac | 10 +++++----- misc/glsl_scraper.py | 48 +++++++++++++++++++++++++++++------------------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/INSTALL b/INSTALL index 17a1a68..fad9989 100644 --- a/INSTALL +++ b/INSTALL @@ -3,7 +3,7 @@ How to Build External Dependencies --------------------- -- glslc, from Google's shaderc project (http://github.com/google/shaderc) +- glslang, from Khronos's glslang project (https://github.com/KhronosGroup/glslang) - AsciiDoc (http://asciidoc.org) - libxml2 (http://www.xmlsoft.org) - Python3 diff --git a/Makefile.am b/Makefile.am index 4b4050c..49790de 100644 --- a/Makefile.am +++ b/Makefile.am @@ -136,7 +136,7 @@ bin_crucible_LDADD = $(MESA_LDFLAGS) -lm -lvulkan -lpthread $(libpng_LIBS) \ $(LIBXML2_LIBS) %-spirv.h: %.c misc/glsl_scraper.py - $(AM_V_GEN) $(PYTHON3) $(srcdir)/misc/glsl_scraper.py --with-glslc=$(GLSLC) -o $@ $< + $(AM_V_GEN) $(PYTHON3) $(srcdir)/misc/glsl_scraper.py --with-glslang=$(GLSLANG) -o $@ $< %_gen.c: %_gen.py $(AM_V_GEN) $(PYTHON3) $< diff --git a/configure.ac b/configure.ac index 9e137e7..b300674 100644 --- a/configure.ac +++ b/configure.ac @@ -48,11 +48,11 @@ AC_CHECK_PROGS([PYTHON2], [python2 python]) AC_CHECK_PROGS([PYTHON3], [python3]) AX_CHECK_PYTHON2_MODULE_OPENCV() -AC_ARG_VAR([GLSLC], [path to glslc executable]) -AC_SUBST([GLSLC]) -AC_CHECK_PROGS([GLSLC], [glslc]) -if test "x$GLSLC" = "x"; then - AC_MSG_ERROR([failed to find glslc]) +AC_ARG_VAR([GLSLANG], [path to glslangValidator executable]) +AC_SUBST([GLSLANG]) +AC_CHECK_PROGS([GLSLANG], [glslangValidator]) +if test "x$GLSLANG" = "x"; then + AC_MSG_ERROR([failed to find glslangValidator]) fi PKG_CHECK_MODULES([libpng16], [libpng16], [HAVE_LIBPNG16=1], [HAVE_LIBPNG16=0]) diff --git a/misc/glsl_scraper.py b/misc/glsl_scraper.py index 4534555..df42b2e 100644 --- a/misc/glsl_scraper.py +++ b/misc/glsl_scraper.py @@ -30,31 +30,38 @@ class Shader: def glsl_source(self): return dedent(self.stream.getvalue()) - def __run_glslc(self, extra_args=[]): - stage_flag = '-fshader-stage=' + def __run_glslang(self, extra_args=[]): if self.stage == 'VERTEX': - stage_flag += 'vertex' + stage = 'vert' elif self.stage == 'TESS_CONTROL': - stage_flag += 'tesscontrol' + stage = 'tesc' elif self.stage == 'TESS_EVALUATION': - stage_flag += 'tesseval' + stage = 'tese' elif self.stage == 'GEOMETRY': - stage_flag += 'geometry' + stage = 'geom' elif self.stage == 'FRAGMENT': - stage_flag += 'fragment' + stage = 'frag' elif self.stage == 'COMPUTE': - stage_flag += 'compute' + stage = 'comp' else: assert False - with subprocess.Popen([glslc] + extra_args + - [stage_flag, '-std=430core', '-o', '-', '-'], + stage_flags = ['-S', stage] + + in_file = tempfile.NamedTemporaryFile(suffix='.'+stage) + src = ('#version 430\n' + self.glsl_source()).encode('utf-8') + in_file.write(src) + in_file.flush() + out_file = tempfile.NamedTemporaryFile(suffix='.spirv') + args = [glslang, '-H'] + extra_args + stage_flags + args += ['-o', out_file.name, in_file.name] + with subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE, stdin = subprocess.PIPE) as proc: - proc.stdin.write(self.glsl_source().encode('utf-8')) out, err = proc.communicate(timeout=30) + in_file.close() if proc.returncode != 0: # Unfortunately, glslang dumps errors to standard out. @@ -63,7 +70,10 @@ class Shader: message = out.decode('utf-8') + '\n' + err.decode('utf-8') raise ShaderCompileError(message.strip()) - return out + out_file.seek(0) + spirv = out_file.read() + out_file.close() + return (spirv, out) def compile(self): def dwords(f): @@ -74,9 +84,9 @@ class Shader: assert len(dword_str) == 4 yield struct.unpack('I', dword_str)[0] - spirv = self.__run_glslc() + (spirv, assembly) = self.__run_glslang() self.dwords = list(dwords(io.BytesIO(spirv))) - self.assembly = str(self.__run_glslc(['-S']), 'utf-8') + self.assembly = str(assembly, 'utf-8') def _dump_glsl_code(self, f, var_name): # First dump the GLSL source as strings @@ -234,10 +244,10 @@ def parse_args(): formatter_class=argparse.RawDescriptionHelpFormatter) p.add_argument('-o', '--outfile', default='-', help='Output to the given file (default: stdout).') - p.add_argument('--with-glslc', metavar='PATH', - default='glslc', - dest='glslc', - help='Full path to the glslc shader compiler.') + p.add_argument('--with-glslang', metavar='PATH', + default='glslangValidator', + dest='glslang', + help='Full path to the glslangValidator shader compiler.') p.add_argument('--glsl-only', action='store_true') p.add_argument('infile', metavar='INFILE') @@ -247,7 +257,7 @@ def parse_args(): args = parse_args() infname = args.infile outfname = args.outfile -glslc = args.glslc +glslang = args.glslang glsl_only = args.glsl_only with open_file(infname, 'r') as infile: -- 2.11.0 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit