mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
	
	
		
			138 lines
		
	
	
		
			5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | 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, enhancements requests, code improvements, etc to: | ||
|  |    spvremapper@lunarg.com | ||
|  | 
 | ||
|  | 
 | ||
|  | 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<std::uint32_t>& spv, std::uint32_t opts = DO_EVERYTHING); | ||
|  | 
 | ||
|  |    // Type for error/log handler functions | ||
|  |    typedef std::function<void(const std::string&)> errorfn_t; | ||
|  |    typedef std::function<void(const std::string&)> 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 glslangValidator 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) | ||
|  | 
 |