diff --git a/packages/b/bgfx/rules/shaders.lua b/packages/b/bgfx/rules/shaders.lua index 5499e8868..107e339e6 100644 --- a/packages/b/bgfx/rules/shaders.lua +++ b/packages/b/bgfx/rules/shaders.lua @@ -4,9 +4,10 @@ -- -- add_rules("@bgfx/shaders") -- add_files("shader.vert", {type = "vertex", output_dir = "shaders", output_name = "shader.vert.bin", profiles = {glsl = "330"}}) +-- add_files("vs_shader.sc", {type = "vertex", output_dir = "shaders", output_name = "shader.vert.h", header = true, profiles = {glsl = "330"}}) rule("shaders") - set_extensions(".vert", ".frag", ".comp") + set_extensions(".sc", ".vert", ".frag", ".comp") on_buildcmd_file(function (target, batchcmds, shaderfile, opt) import("lib.detect.find_program") import("core.base.option") @@ -24,7 +25,13 @@ rule("shaders") if fileconfig and fileconfig.output_name then output_filename = fileconfig.output_name else - output_filename = path.filename(shaderfile) .. ".bin" + local filename = path.filename(shaderfile) + output_filename = filename:match("^(.*)%.sc$") or filename + if fileconfig and fileconfig.header then + output_filename = output_filename .. ".h" + else + output_filename = output_filename .. ".bin" + end end local output_dir @@ -38,26 +45,7 @@ rule("shaders") if fileconfig and fileconfig.vardef then vardef_filename = fileconfig.vardef else - vardef_filename = path.join( - path.directory(shaderfile), - path.basename(shaderfile) .. ".varying.def.sc") - end - - local shader_type - if fileconfig and fileconfig.type then - if table.contains(bgfx_types, fileconfig.type) then - shader_type = fileconfig.type - else - raise("unsupported shader type " .. fileconfig.type) - end - elseif shaderfile:match("%.vert$") then - shader_type = "vertex" - elseif shaderfile:match("%.frag$") then - shader_type = "fragment" - elseif shaderfile:match("%.comp$") then - shader_type = "compute" - else - raise("cannot determine shader type from file name " .. path.filename(shaderfile)) + vardef_filename = path.join(path.directory(shaderfile), "varying.def.sc") end -- determine platform-specific shaderc arguments @@ -73,8 +61,8 @@ rule("shaders") } local bgfx_default_profiles = { windows = { - vertex = {dx9 = "s_3_0", dx11 = "s_5_0", glsl = "120"}, - fragment = {dx9 = "s_3_0", dx11 = "s_5_0", glsl = "120"}, + vertex = {dx11 = "s_5_0", glsl = "120"}, + fragment = {dx11 = "s_5_0", glsl = "120"}, compute = {dx11 = "s_5_0", glsl = "430"}, }, macosx = { @@ -89,6 +77,23 @@ rule("shaders") } } + local shader_type + if fileconfig and fileconfig.type then + if table.contains(bgfx_types, fileconfig.type) then + shader_type = fileconfig.type + else + raise("unsupported shader type " .. fileconfig.type) + end + elseif shaderfile:match("^vs_.*%.sc$") or shaderfile:match("%.vert$") then + shader_type = "vertex" + elseif shaderfile:match("^fs_.*%.sc$") or shaderfile:match("%.frag$") then + shader_type = "fragment" + elseif shaderfile:match("^cs_.*%.sc$") or shaderfile:match("%.comp$") then + shader_type = "compute" + else + raise("cannot determine shader type from file name " .. path.filename(shaderfile)) + end + -- build command args local args = { "-f", shaderfile, @@ -96,6 +101,15 @@ rule("shaders") "--varyingdef", vardef_filename, "--platform", bgfx_platforms[target:plat()], } + + if fileconfig and fileconfig.header then + table.insert(args, "--bin2c") + if fileconfig.header ~= true then + table.insert(args, fileconfig.header) + end + end + + -- print(target:pkg("bgfx"):installdir()) for _, includedir in ipairs(target:get("includedirs")) do table.insert(args, "-i") table.insert(args, includedir) @@ -113,7 +127,7 @@ rule("shaders") local outputdir = path.join(target:targetdir(), output_dir, folder) batchcmds:mkdir(outputdir) local binary = path.join(outputdir, output_filename) - + -- compiling local real_args = {} table.join2(real_args, args) diff --git a/packages/b/bgfx/xmake.lua b/packages/b/bgfx/xmake.lua index 37765eef0..2a99d5a77 100644 --- a/packages/b/bgfx/xmake.lua +++ b/packages/b/bgfx/xmake.lua @@ -47,7 +47,7 @@ package("bgfx") local bimgdir = package:resourcefile("bimg") local genie = is_host("windows") and "genie.exe" or "genie" local args = {} - if is_plat("windows|native", "macosx", "linux") then + if package:is_plat("windows", "macosx", "linux") then args = {"--with-tools"} end if package:config("shared") then