From 49ce2573e08a6194f7d5f59d1e285db3ba21d678 Mon Sep 17 00:00:00 2001 From: Marko Tintor Date: Fri, 20 Dec 2024 19:28:27 -0800 Subject: [PATCH] Add new 'opts' attribute to shader_binary() rule AND allow .h files in 'srcs' attribute to be #include-d Enables sharing of code and definitions between shaders and C/C++ code. Enables setting optimization level (-O) and setting defines (-D) from bazel. --- defs.bzl | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/defs.bzl b/defs.bzl index 9fcbd39..3a82a81 100644 --- a/defs.bzl +++ b/defs.bzl @@ -7,6 +7,7 @@ _shader_file_extensions = [ '.comp', '.glsl', '.spvasm', + '.h', ] _shader_stages = [ @@ -18,29 +19,46 @@ _shader_stages = [ 'compute', ] -def _SpvOutput(srcs): - return [src.basename + '.spv' for src in srcs] - -def _SpvasmOutput(srcs): - return [src.basename + '.spvasm' for src in srcs] +def _gather_incdirs(files): + # Use a dict to avoid duplicates (sets are not allowed in Starlark) + incdirs_dict = {} + for f in files: + path = f.path + if "/" in path: + parent_dir = path.rsplit("/", 1)[0] + incdirs_dict[parent_dir] = True + incdirs_list = [] + for d in sorted(incdirs_dict.keys()): + incdirs_list.append("-I" + d) + return incdirs_list def _shader_binary(ctx): spvOut = ctx.actions.declare_file(ctx.attr.name + ".spv") - shaderStage = '' + + all_inputs = list(ctx.files.srcs) + incArgs = _gather_incdirs(all_inputs) glslcArgs = [] if ctx.attr.stage: glslcArgs.append("-shader-stage=" + ctx.attr.stage) - for src in ctx.files.srcs: - glslcArgs.append(src.path) + # Add include paths and user options + glslcArgs += incArgs + glslcArgs += ctx.attr.opts + + # Add sources (excluding headers) + compile_inputs = [] + for f in all_inputs: + if not f.path.endswith(".h"): + glslcArgs.append(f.path) + compile_inputs.append(f) glslcArgs.append('-o') glslcArgs.append(spvOut.path) ctx.actions.run( - inputs = ctx.files.srcs, + inputs = all_inputs, outputs = [spvOut], executable = ctx.executable.glslc, arguments = glslcArgs, @@ -62,6 +80,7 @@ shader_binary = rule( default = '', values = [''] + _shader_stages, ), + "opts": attr.string_list(default = []), "glslc": attr.label( default = Label("@vulkan_sdk//:glslc"), allow_single_file = True,