Khronos-reference front end for GLSL/ESSL, partial front end for HLSL, and a SPIR-V generator.

#compiler #validator #glsl #shader #spir-v #hlsl #glslang #glslangvalidator #essl #shader #dev-tools

Diego Novillo f43df42fe6 Revert "Fix erroneous parse error when declaring variables using struct names" (#4002) 5 dni temu
.github f33fa78f88 Bump github/codeql-action from 3.29.0 to 3.29.2 2 tygodni temu
External 3b495e1450 cmake: Minor CMake cleanup 4 miesięcy temu
SPIRV 502ef438a1 Fix line endings in spirv.hpp11 2 tygodni temu
StandAlone be4ee7d0e3 Remove unnecessary whitespace 2 miesięcy temu
Test f43df42fe6 Revert "Fix erroneous parse error when declaring variables using struct names" (#4002) 5 dni temu
build_overrides dac38b8fce Add basic GN configurations 4 lat temu
glslang f43df42fe6 Revert "Fix erroneous parse error when declaring variables using struct names" (#4002) 5 dni temu
gtests f43df42fe6 Revert "Fix erroneous parse error when declaring variables using struct names" (#4002) 5 dni temu
kokoro 18f581a8a2 kokoro: linux: use cpp-builder image instead of radial-build 5 miesięcy temu
ndk_test 4f01996c9d Merge ancillary libraries into main glslang library and stub originals 11 miesięcy temu
.clang-format 0e5d1bb66a clang-format correction and typo (clang format likely not complete) 6 lat temu
.gitattributes 69d0c1acc2 Remove executable bits from code/data files (#2420) 4 lat temu
.gitignore b888ebcee8 Add .vs/ folder to .gitignore (#3963) 1 miesiąc temu
.gn dac38b8fce Add basic GN configurations 4 lat temu
.mailmap 45405e1d94 Add a .mailmap file 2 lat temu
Android.mk d59c84d388 Fix typo in Android.mk 11 miesięcy temu
BUILD.gn 963588074b Fix renamed spriv.hpp11 in BUILD.gn 2 miesięcy temu
CHANGES.md 8a85691a07 Update CHANGES for 15.4.0 4 tygodni temu
CMakeLists.txt 21b4e37133 Revert "Fix logic in CMakeFiles for tests on Windows (#3955)" (#3980) 1 miesiąc temu
CODE_OF_CONDUCT.md 4685f3246e Create CODE_OF_CONDUCT.md 6 lat temu
DEPS 0f52e7ef12 Fix GN build and presubmits 4 lat temu
LICENSE.txt d465ac12dd Update LICENSE.txt 3 lat temu
README-spirv-remap.txt 05ba15169e Update the README-spirv-remap.txt 1 rok temu
README.md 1f1ef75603 Cleanup old CMake related docs in readme.md 8 miesięcy temu
SECURITY.md d9a6fb2247 Create a Security Policy (#3169) 2 lat temu
_config.yml c8274e941e Make file formatting comply with POSIX and Unix standards 5 lat temu
build_info.h.tmpl 6fdf03e4d1 Fix version check macros 3 lat temu
build_info.py d81aeef9f8 python 3.12: remove deprecated datetime.utcfromtimestamp 8 miesięcy temu
gen_extension_headers.py a7603c132d Use nullptr where possible instead of NULL or 0 2 lat temu
known_good.json fcffe4d409 pick up validator fix 3 tygodni temu
known_good_khr.json 302a663a38 Use googletest version 1.14.0 1 rok temu
license-checker.cfg f3234432d0 Replace spirv.hpp with spirv.hpp11 3 miesięcy temu
parse_version.cmake e3dab6f0d2 Code review. Thx ben-clayton for comments. 4 lat temu
standalone.gclient dac38b8fce Add basic GN configurations 4 lat temu
update_glslang_sources.py f102d0f4fa Fix update_glslang_sources.py to not use distutils 1 rok temu

README-spirv-remap.txt


VERSION
--------------------------------------------------------------------------------
spirv-remap 0.97

INTRO:
--------------------------------------------------------------------------------
spirv-remap is a utility to improve compression of SPIR-V binary files via
entropy reduction, plus optional stripping of debug information and
load/store optimization. It transforms SPIR-V to SPIR-V, remapping IDs. The
resulting modules have an increased ID range (IDs are not as tightly packed
around zero), but will compress better when multiple modules are compressed
together, since compressor's dictionary can find better cross module
commonality.

Remapping is accomplished via canonicalization. Thus, modules can be
compressed one at a time with no loss of quality relative to operating on
many modules at once. The command line tool operates on multiple modules
only in the trivial repetition sense, for ease of use. The remapper API
only accepts a single module at a time.

There are two modes of use: command line, and a C++11 API. Both are
described below.

spirv-remap is currently in an alpha state. Although there are no known
remapping defects, it has only been exercised on one real world game shader
workload.


FEEDBACK
---------------------------------------------------------------------------------
Report defects, enhancement requests, code improvements, etc by creating
issues in the glslang repository at https://github.com/KhronosGroup/glslang

COMMAND LINE USAGE:
--------------------------------------------------------------------------------
Examples are given with a verbosity of one (-v), but more verbosity can be
had via -vv, -vvv, etc, or an integer parameter to --verbose, such as
"--verbose 4". With no verbosity, the command is silent and returns 0 on
success, and a positive integer error on failure.

Pre-built binaries for several OSs are available. Examples presented are
for Linux. Command line arguments can be provided in any order.

1. Basic ID remapping

Perform ID remapping on all shaders in "*.spv", writing new files with
the same basenames to /tmp/out_dir.

spirv-remap -v --map all --input *.spv --output /tmp/out_dir

2. Perform all possible size reductions

spirv-remap-linux-64 -v --do-everything --input *.spv --output /tmp/out_dir

Note that --do-everything is a synonym for:

--map all --dce all --opt all --strip all

API USAGE:
--------------------------------------------------------------------------------

The public interface to the remapper is defined in SPIRV/SPVRemapper.h as follows:

namespace spv {

class spirvbin_t
{
public:
enum Options { ... };
spirvbin_t(int verbose = 0); // construct

// remap an existing binary in memory
void remap(std::vector& spv, std::uint32_t opts = DO_EVERYTHING);

// Type for error/log handler functions
typedef std::function errorfn_t;
typedef std::function logfn_t;

// Register error/log handling functions (can be c/c++ fn, lambda fn, or functor)
static void registerErrorHandler(errorfn_t handler) { errorHandler = handler; }
static void registerLogHandler(logfn_t handler) { logHandler = handler; }
};

} // namespace spv

The class definition is in SPVRemapper.cpp.

remap() accepts an std::vector of SPIR-V words, modifies them per the
request given in 'opts', and leaves the 'spv' container with the result.
It is safe to instantiate one spirvbin_t per thread and process a different
SPIR-V in each.

The "opts" parameter to remap() accepts a bit mask of desired remapping
options. See REMAPPING AND OPTIMIZATION OPTIONS.

On error, the function supplied to registerErrorHandler() will be invoked.
This can be a standard C/C++ function, a lambda function, or a functor.
The default handler simply calls exit(5); The error handler is a static
member, so need only be set up once, not once per spirvbin_t instance.

Log messages are supplied to registerLogHandler(). By default, log
messages are eaten silently. The log handler is also a static member.

BUILD DEPENDENCIES:
--------------------------------------------------------------------------------
1. C++11 compatible compiler
2. cmake
3. glslang


BUILDING
--------------------------------------------------------------------------------
The standalone remapper is built along side glslang through its
normal build process.


REMAPPING AND OPTIMIZATION OPTIONS
--------------------------------------------------------------------------------
API:
These are bits defined under spv::spirvbin_t::, and can be
bitwise or-ed together as desired.

MAP_TYPES = canonicalize type IDs
MAP_NAMES = canonicalize named data
MAP_FUNCS = canonicalize function bodies
DCE_FUNCS = remove dead functions
DCE_VARS = remove dead variables
DCE_TYPES = remove dead types
OPT_LOADSTORE = optimize unneeded load/stores
MAP_ALL = (MAP_TYPES | MAP_NAMES | MAP_FUNCS)
DCE_ALL = (DCE_FUNCS | DCE_VARS | DCE_TYPES)
OPT_ALL = (OPT_LOADSTORE)
ALL_BUT_STRIP = (MAP_ALL | DCE_ALL | OPT_ALL)
DO_EVERYTHING = (STRIP | ALL_BUT_STRIP)