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)
 | 
						|
 |