anv: Remove the GLSL -> SPIR-V scraper/converter
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:20:02 +0000 (16:20 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 23:20:04 +0000 (16:20 -0700)
This was very useful to get us up-and-going.  However, now that we can use
NIR directly for meta shaders, we don't need this anymore and we might as
well drop the glslc dependency.

configure.ac
src/vulkan/Makefile.am
src/vulkan/glsl_scraper.py [deleted file]

index fa64dab4e48c0fa9865da81eaf46e8bef642797f..6ff50abda3d852d75efa3a53a2e847b4468aaa8e 100644 (file)
@@ -1552,10 +1552,6 @@ AC_SUBST([GBM_PC_LIB_PRIV])
 
 AM_CONDITIONAL(HAVE_VULKAN, true)
 
-AC_ARG_VAR([GLSLC], [Path to the glslc executable])
-AC_CHECK_PROGS([GLSLC], [glslc])
-AC_SUBST([GLSLC])
-
 dnl
 dnl EGL configuration
 dnl
index aada6314b2a41ede2315123ff078fa4fab9ac1a0..765d2cef03ddd35f3b85a59adf89d0e793089772 100644 (file)
@@ -116,9 +116,6 @@ anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_include_HEADERS)
 anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_include_HEADERS)
        $(AM_V_GEN)cat $(vulkan_include_HEADERS) | $(PYTHON2) $< code > $@
 
-%_spirv_autogen.h: %.c glsl_scraper.py
-       $(AM_V_GEN) $(PYTHON3) $(srcdir)/glsl_scraper.py --with-glslc=$(GLSLC) -o $@ $<
-
 CLEANFILES = $(BUILT_SOURCES)
 
 libvulkan_la_LIBADD = $(WAYLAND_LIBS) -lxcb -lxcb-dri3 \
diff --git a/src/vulkan/glsl_scraper.py b/src/vulkan/glsl_scraper.py
deleted file mode 100644 (file)
index 244cb48..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-#! /usr/bin/env python3
-
-import argparse
-import io
-import os
-import re
-import shutil
-import struct
-import subprocess
-import sys
-import tempfile
-from textwrap import dedent
-
-class ShaderCompileError(RuntimeError):
-    def __init__(self):
-        super(ShaderCompileError, self).__init__('Compile error')
-
-class Shader:
-    def __init__(self, stage):
-        self.stream = io.StringIO()
-        self.stage = stage
-        self.dwords = None
-
-    def add_text(self, s):
-        self.stream.write(s)
-
-    def finish_text(self, line):
-        self.line = line
-
-    def glsl_source(self):
-        return dedent(self.stream.getvalue())
-
-    def __run_glslc(self, extra_args=[]):
-        stage_flag = '-fshader-stage='
-        if self.stage == 'VERTEX':
-            stage_flag += 'vertex'
-        elif self.stage == 'TESS_CONTROL':
-            stage_flag += 'tesscontrol'
-        elif self.stage == 'TESS_EVALUATION':
-            stage_flag += 'tesseval'
-        elif self.stage == 'GEOMETRY':
-            stage_flag += 'geometry'
-        elif self.stage == 'FRAGMENT':
-            stage_flag += 'fragment'
-        elif self.stage == 'COMPUTE':
-            stage_flag += 'compute'
-        else:
-            assert False
-
-        with subprocess.Popen([glslc] + extra_args +
-                              [stage_flag, '-std=430core', '-o', '-', '-'],
-                              stdout = subprocess.PIPE,
-                              stdin = subprocess.PIPE) as proc:
-
-            proc.stdin.write(self.glsl_source().encode('utf-8'))
-            out, err = proc.communicate(timeout=30)
-
-            if proc.returncode != 0:
-                raise ShaderCompileError()
-
-            return out
-
-    def compile(self):
-        def dwords(f):
-            while True:
-                dword_str = f.read(4)
-                if not dword_str:
-                    return
-                assert len(dword_str) == 4
-                yield struct.unpack('I', dword_str)[0]
-
-        spirv = self.__run_glslc()
-        self.dwords = list(dwords(io.BytesIO(spirv)))
-        self.assembly = str(self.__run_glslc(['-S']), 'utf-8')
-
-    def dump_c_code(self, f):
-        f.write('\n\n')
-        prefix = '_anv_glsl_helpers_shader{0}'.format(self.line)
-
-        f.write('/* GLSL Source code:\n')
-        for line in self.glsl_source().splitlines():
-            f.write(' * ' + line + '\n')
-
-        f.write(' *\n')
-
-        f.write(' * SPIR-V Assembly:\n')
-        f.write(' *\n')
-        for line in self.assembly.splitlines():
-            f.write(' * ' + line + '\n')
-        f.write(' */\n')
-
-        f.write('static const uint32_t {0}_spirv_code[] = {{'.format(prefix))
-        line_start = 0
-        while line_start < len(self.dwords):
-            f.write('\n    ')
-            for i in range(line_start, min(line_start + 6, len(self.dwords))):
-                f.write(' 0x{:08x},'.format(self.dwords[i]))
-            line_start += 6
-        f.write('\n};\n')
-
-        f.write(dedent("""\
-            static const VkShaderModuleCreateInfo {0}_info = {{
-                .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
-                .codeSize = sizeof({0}_spirv_code),
-                .pCode = {0}_spirv_code,
-            }};
-            """.format(prefix)))
-
-token_exp = re.compile(r'(GLSL_VK_SHADER_MODULE|\(|\)|,)')
-
-class Parser:
-    def __init__(self, f):
-        self.infile = f
-        self.paren_depth = 0
-        self.shader = None
-        self.line_number = 1
-        self.shaders = []
-
-        def tokenize(f):
-            leftover = ''
-            for line in f:
-                pos = 0
-                while True:
-                    m = token_exp.search(line, pos)
-                    if m:
-                        if m.start() > pos:
-                            leftover += line[pos:m.start()]
-                        pos = m.end()
-
-                        if leftover:
-                            yield leftover
-                            leftover = ''
-
-                        yield m.group(0)
-
-                    else:
-                        leftover += line[pos:]
-                        break
-
-                self.line_number += 1
-
-            if leftover:
-                yield leftover
-
-        self.token_iter = tokenize(self.infile)
-
-    def handle_shader_src(self):
-        paren_depth = 1
-        for t in self.token_iter:
-            if t == '(':
-                paren_depth += 1
-            elif t == ')':
-                paren_depth -= 1
-                if paren_depth == 0:
-                    return
-
-            self.current_shader.add_text(t)
-
-    def handle_macro(self, macro):
-        t = next(self.token_iter)
-        assert t == '('
-
-        # Throw away the device parameter
-        t = next(self.token_iter)
-        t = next(self.token_iter)
-        assert t == ','
-
-        stage = next(self.token_iter).strip()
-
-        t = next(self.token_iter)
-        assert t == ','
-
-        self.current_shader = Shader(stage)
-        self.handle_shader_src()
-        self.current_shader.finish_text(self.line_number)
-
-        self.shaders.append(self.current_shader)
-        self.current_shader = None
-
-    def run(self):
-        for t in self.token_iter:
-            if t == 'GLSL_VK_SHADER_MODULE':
-                self.handle_macro(t)
-
-def open_file(name, mode):
-    if name == '-':
-        if mode == 'w':
-            return sys.stdout
-        elif mode == 'r':
-            return sys.stdin
-        else:
-            assert False
-    else:
-        return open(name, mode)
-
-def parse_args():
-    description = dedent("""\
-        This program scrapes a C file for any instance of the
-        qoShaderCreateInfoGLSL and qoCreateShaderGLSL macaros, grabs the
-        GLSL source code, compiles it to SPIR-V.  The resulting SPIR-V code
-        is written to another C file as an array of 32-bit words.
-
-        If '-' is passed as the input file or output file, stdin or stdout
-        will be used instead of a file on disc.""")
-
-    p = argparse.ArgumentParser(
-            description=description,
-            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('infile', metavar='INFILE')
-
-    return p.parse_args()
-
-
-args = parse_args()
-infname = args.infile
-outfname = args.outfile
-glslc = args.glslc
-
-with open_file(infname, 'r') as infile:
-    parser = Parser(infile)
-    parser.run()
-
-for shader in parser.shaders:
-    shader.compile()
-
-with open_file(outfname, 'w') as outfile:
-   outfile.write(dedent("""\
-      /* ===========================  DO NOT EDIT!  ===========================
-       *            This file is autogenerated by glsl_scraper.py.
-       */
-
-      #include <stdint.h>
-
-      #define _ANV_SPIRV_MODULE_INFO2(_line) _anv_glsl_helpers_shader ## _line ## _info
-      #define _ANV_SPIRV_MODULE_INFO(_line) _ANV_SPIRV_MODULE_INFO2(_line)
-
-      #define GLSL_VK_SHADER_MODULE(device, stage, ...) ({                 \\
-         VkShaderModule __module;                                          \\
-         ANV_CALL(CreateShaderModule)(anv_device_to_handle(device),        \\
-                                      &_ANV_SPIRV_MODULE_INFO(__LINE__),   \\
-                                      &__module);                          \\
-         __module;                                                         \\
-      })
-      """))
-
-   for shader in parser.shaders:
-      shader.dump_c_code(outfile)