Revision history for SPIRV-Tools v2019.2-dev 2019-01-07 - Start v2019.2-dev v2019.1 2019-01-07 - General: - Created a new tool called spirv-reduce. - Add cmake option to turn off SPIRV_TIMER_ENABLED (#2103) - New optimization pass to update the memory model from GLSL450 to VulkanKHR. - Recognize OpTypeAccelerationStructureNV as a type instruction and ray tracing storage classes. - Fix GCC8 build. - Add --target-env flag to spirv-opt. - Add --webgpu-mode flag to run optimizations for webgpu. - The output disassembled line number stead of byte offset in validation errors. (#2091) - Optimizer - Added the instrumentation passes for bindless validation. - Added passes to help preserve OpLine information (#2027) - Add basic support for EXT_fragment_invocation_density (#2100) - Fix invalid OpPhi generated by merge-return. (#2172) - Constant and type manager have been turned into analysies. (#2251) Fixes: - #2018: Don't inline functions with a return in a structured CFG contstruct. - #2047: Fix bug in folding when volatile stores are present. - #2053: Fix check for when folding floating pointer values is allowed. - #2130: Don't inline recursive functions. - #2202: Handle multiple edges between two basic blocks in SSA-rewriter. - #2205: Don't unswitch a latch condition during loop unswitch. - #2245: Don't fold branch in loop unswitch. Run dead branch elimination to fold them. - #2204: Fix eliminate common uniform to place OpPhi instructions correctly. - #2247: Fix type mismatches caused by scalar replacement. - #2248: Fix missing OpPhi after merge return. - #2211: After merge return, fix invalid continue target. - #2210: Fix loop invariant code motion to not place code between merge instruction and branch. - #2258: Handle CompositeInsert with no indices in VDCE. - #2261: Have replace load size handle extact with no index. - Validator - Changed the naming convention of outputing ids with names in diagnostic messages. - Added validation rules for UniformConstant variables in Vulkan. - #1949: Validate uniform variable type in Vulkan - Ensure for OpVariable that result type and storage class operand agree (#2052) - Validator: Support VK_EXT_scalar_block_layout - Added Vulkan memory model semantics validation - Added validation checkes spefic to WebGPU environment. - Add support for VK_EXT_Transform_feedback capabilities (#2088) - Add validation for OpArrayLength. (#2117) - Ensure that function parameter's type is not void (#2118) - Validate pointer variables (#2111) - Add check for QueueFamilyKHMR memory scope (#2144) - Validate PushConstants annotation and type (#2140) - Allow Float16/Int8 for Vulkan 1.0 (#2153) - Check binding annotations in resource variables (#2151, #2167) - Validate OpForwardPointer (#2156) - Validate operation for OpSpecConstantOp (#2260) Fixes: - #2049: Allow InstanceId for NV ray tracing - Reduce - Initial commit wit a few passes to reduce test cases. - Validation is run after each reduction step. Fixes: v2018.6 2018-11-07 - General: - Added support for the Nvidia Turing and ray tracing extensions. - Make C++11 the CXX standard in CMakeLists.txt. - Enabled a parallel build for MSVC. - Enable pre-compiled headers for MSVC. - Added a code of conduct. - EFFCEE and RE2 are now required when build the tests. - Optimizer - Unrolling loops marked for unrolling in the legalization passes. - Improved the compile time of loop unrolling. - Changee merge-return to create a dummy loop around the function. - Small improvement to merge-blocks to allow it to merge more often. - Enforce an upper bound for the ids, and add option to set it. - #1966: Report error if there are unreachable block before running merge return Fixes: - #1917: Allow 0 (meaning unlimited) as a parameter to --scalar-replacement - #1915: Improve handling of group decorations. - #1942: Fix incorrect uses of the constant manager. Avoids type mismatches in generated code. - #1997: Fix dead branch elimination when there is a loop in folded selection. - #1991: Fixes legality check in if-conversion. - #1987: Add nullptr check to array copy propagation. - #1984: Better handling of OpUnreachable in ADCE. - #1983: Run merge return on reachable functions only. - #1956: Handled atomic operations in ADCE. - #1963: Fold integer divisions by 0 to 0. - #2019: Handle MemberDecorateStringGOOGLE in ADCE and strip reflect. - Validator - Added validation for OpGroupNonUniformBallotBitCount. - Added validation for the Vulkan memory model. - Added support for VK_KHR_shader_atddomic_int64. - Added validation for execution modes. - Added validation for runtime array layouts. - Added validation for 8-bit storage. - Added validation of OpPhi instructions with pointer result type. - Added checks for the Vulkan memory model. - Validate MakeTexelAvailableKHR and MakeTexelVisibleKHR - Allow atomic function pointer for OpenCL. - FPRounding mode checks were implemented. - Added validation for the id bound with an option to set the max id bound. Fixes: - #1882: Improve the validation of decorations to reduce memory usage. - #1891: Fix an potential infinite loop in dead-branch-elimination. - #1405: Validate the storage class of boolean objects. - #1880: Identify arrays of type void as invalid. - #487: Validate OpImageTexelPointer. - #1922: Validate OpPhi instructions are at the start of a block correctly. - #1923: Validate function scope variable are at the start of the entry block. v2018.5 2018-09-07 - General: - Support SPV_KHR_vulkan_memory_model - Update Dim capabilities, to match SPIR-V 1.3 Rev 4 - Automated build bots no run tests for the VS2013 case - Support Chromium GN build - Use Kokoro bots: - Disable Travis-CI bots - Disable AppVeyor VisualStudio Release builds. Keep VS 2017 Debug build - Don't check export symbols on OSX (Darwin): some installations don't have 'objdump' - Reorganize source files and namespaces - Fixes for ClangTidy, and whitespace (passes 'git cl presumit --all -uf') - Fix unused param compile warnings/errors when Effcee not present - Avoid including time headers when timer functionality is disabled - Avoid too-stringent warnings flags for Clang on Windows - Internal refactoring - Add hooks for automated fuzzing - Add testing of command line executables - #1688: Use binary mode on stdin; fixes "spirv-dis <foo.spv" on Windows - Optimizer - The optimizer validates the module before it begins - Add API to register passes by string name - Fold a vector shuffle feeding a vector shuffle - Add -combine-access-chains transform - Refactor how IRContext is handled by passes - Improve bookkeeping for instruction result type and result id - Fix over-duplication of decorations - Fix handling of exits from selections in dead-branch elimination, and dead code elimination. - Fix handling of certain kinds of flow control in merge-return Fixes: - #1721: Fix size bug when folding vector shuffles - #1722: Fix size infinite loop when folding vector shuffles - #1724: Fix finding a constant of a specific type - #1727: Dead branch elim: Reorder blocks if needed to satisfy dominance rule - #1729: Handle VariablePointers cases in various optimizations - #1731: Fix vector shuffle with literal id indicating undef value - #1736: Fix handling of decorations and phis in merge-return - #1787: Fix handling of decorations related to access chains - #1865: Avoid leaking memory for SPIR-V constant values - Validator - Improve error messages - Avoid platform-dependent traversal ordering, to ensure consistent messages - Use libspirv::Instruction where possible - Add option to skip all block layout checks - Validate all type IDs - Validate uses of OpFunction - Validate uses of OpTypeFunction - Disallow a struct containing its own type https://crbug.com/874372 - #1685: Vulkan permits non-monotonic offsets for block members - #1697: Enforce block layout rules even when using relaxed block layout option - #1719: Fix line number for vector shuffle valiation error - #1789: Avoid assertion failure when validating some functions - #1800: Fix validation of OpCopyMemorySized - #1822: Stop enforcing struct member offset montonicity - #1831: Disallow void members in structs v2018.4 2018-07-08 - General: - Support SPV_KHR_8bit_storage - Add gclient and presubmit configurations - Enable Kokoro build bots (#1625) - Group tests into fewer executables, reduces load on CI - Port test script to Python 3 - Symbol export tests respect SPIRV_SKIP_TESTS - #1596: Operand lookup succeeds if enabled by a capability - #1624: Instruction lookup succeeds if enabled by a capability - Refactoring namespaces: - #1678: Change libspirv to spvtools - Code in source/utils moved into spvtools::utils - Code in source/comp moved into spvtools::comp - Optimizer: - Remove insert-extract-elim pass. Use simplification pass instead. - Preserve instruction-to-block mapping in most passes, to reduce runtime. - Small vector optimization for operands - Add pass to move Private variables to Function. Increase opportunity to optimize. - Fixes: #1120: Check static uses of entry point interfaces #1372: Avoid merging some structs, to preserve names for reflection #1577: Scalar replacement uses only undecorated types. #1578: Fix handling of forward-pointer types, and types embedding pointers to themselves. #1591: Inliner: Callee variable with initializer should have a store at the call site. #1634: Fix crash: Use type id in vector type lookup #1649: Fix assert in compact-ids pass Fix constant folder: ensure it uses the right type #1659: Folding rules added to IRContext. Avoids leak. - Validator - Add work-in-progress WebGPU environment. Disallows OpUndef - #670, #1581: Improve error messages; disassemble instruction - #491: Check structured switches - #937: Check layout rules for Block and BufferBlock in Uniform, StorageBuffer, PushConstant - #1281: Check invalid branches into structured constructs - #1522: Disallow array-of-arrays with DescriptorSets - #1577: Allow duplicate pointer types. - #1581: Better messages: output ID names along with numbers in more cases. - #1597: Check Vulkan 1.1 capabilities - #1618: Check invalid exit from structured case construct - #1622: Run IdPass before DataRulesPass - #1632: Reduce test time by artificially lowering limits in limit test - #1638: Block-decorated structs member order must respect offset order - #1657: Improve CFG validation diagnostics - Khronos SPIR-V #337: GLSL.std.450 Refract instruction Eta param can be any float scalar. - #1606: PushConstant Blocks follow storage-buffer layout rules - #1664: Check layout of StorageBuffer variables with Block decoration, using storage buffer rules - #1666: Layout validation should permit {vec3; float} packing - #1637, #1668: Layout validation uses RowMajor, ArrayStride, MatrixStride properly - Linker - Avoid buffer overrun when creating OpModuleProcessed v2018.3 2018-05-25 - General: - Support SPV_EXT_descriptor_indexing - Support SPV_GOOGLE_decorate_string - Support SPV_GOOGLE_hlsl_functionality1 - Support SPV_NV_shader_subgroup_partitioned - Use "unified1" grammar from SPIRV-Headers - Simplify support for new extensions. Assembler, disassembler, and simple validation support is automatic if new tokens are introduced with appropriate extension attributes in the "unified1" SPIR-V core grammar. - Disassembler: Emit more digits on floating point, to reliably reproduce all significand bits. (Use std::max_digits10 instead of std::digits10) - Fix compilation for old XCode versions: Explicit construction required for std::set. - Optimizer: - Add --strip-reflect - Add --time-report - Add --loop-fission - Add lop fusion. - Add loop peeling pass and internal utility. - Improve optimizer runtime. - Merge-return now works with structured control flow. - New (faster) SSA rewriter to convert local loads and stores to SSA IDs and phis. Can replace load/store elimination passes. - Fix instruction folding case: insertion that feeds and extract, when the extract remains. - Fold OpDot. - Fold OpFNegate. - Fold multply and divide of same value. - Fold FClamp feeding a compare. - Fold OpLoad feeding an extract, to reduce excessive copying. (#1547) - Fold Fmix feeding an extract. - Use simplification pass instead of insert-extract elimination. - Constant fold OpVectorTimesScalar. - Copy propagate arrays, in simple cases. - Aggressive dead code elimination: Can remove more instructions, e.g. derivatives. - Aggressive dead code elimination: Remove Workgroup variables that are written but not read. - Better handling of OpImageTexelPointer - Initial utilities for scalar evolution. - Add Vector dead code elimination. - Each pass can only run once. - Allow code hosting in if-conversion. - Add external interface for adding a PassToken, so external code can make their own passes. - Fixes: #1404: Don't optimize away the compute compute workgroup size constant. #1407: Remove a bad assertion #1456: Fix bug in SSA rewriter related to variables updated in loops. #1487: Fix long runtime in Dead insertion elimination: Don't revist select phi nodes. #1492: Aggressive dead code elimination can remove OpDecorateStringGOOGLE. #1527: Fix inlining of functions having OpKill and OpUnreachable. #1559: Fix assert failure in reduce-load-size pass. #1556: Aggressive dead code elimination: Fix handling of OpCopyMemory. - Validator: - Check Vulkan built-in variables - Check Vulkan-specific atomic result type rule. - Relax control barrier check for SPIR-V 1.3. Fixes #1427 - Check OpPhi. - Check OpMemoryModel. - Stop checking sizes derived from spec-constants. - Re-enable checks for OpUConvert. - Vulkan: Fix check for PrimitiveId: Permit as Input in fragment shader. - Validate binary version for the given target environment. - Add tests for OpBranch checks. - Vulkan 1.1: Check scope for non-uniform subgroup operations. - Fix checks for SPV_AMD_gpu_shader_int16. - Fix logical layout check for OpDecorateId. - Fix checks for ViewportIndex & Layer for Vulkan and SPV_EXT_shader_viewport_index_layer. - Fixes: #1470: Vulkan: Don't restrict WorkgroupSize to Input storage class. #1469: Vulkan: Permit Subgroup memory scope for Vulkan 1.1. #1472: Per-vertex variable validation fixes. #1483: Valdiate barrier execution scopes for Vulkan 1.1. - Fixes: #898: Linker properly removes FuncParamAttr from imported symbols. #924, #1174: Fix handling of decoration groups in optimizer, linker. v2018.2 2018-03-07 - General: - Support SPIR-V 1.3 and Vulkan 1.1. - Default target environment is now SPIR-V 1.3. For command-line tools, use the --target-env option to override the default. Examples: # Generate a SPIR-V 1.0 binary instead of SPIR-V 1.3 spirv-as --target-env spv1.0 a.spvasm -o a.spv spirv-as --target-env vulkan1.0 a.spvasm -o a.spv # Validate as Vulkan 1.0 spirv-val --target-env vulkan1.0 a.spv - Support SPV_GOOGLE_decorate_string and SPV_GOOGLE_hlsl_functionality1 - Fixes: - Fix Android.mk build. Compilation was failing due to missing definitions of SpvCapabilityFloat16ImageAMD and other enumerated values. - Optimizer: Avoid generating duplicate names when merging types. - #1375: Validator: SPV_AMD_gpu_shaer_half_float implicitly allows declaration of the 16-bit floating point type. - #1376: Optimizer: Avoid folding half-precision float. v2018.1 2018-03-02 - General: - Support Visual Studio 2013 again. (Continue support for VS 2015 and VS 2017.) - Support building SPIRV-Tools as a shared library. - Improve the HLSL legalization optimization recipe. #1311 - Optimizer: - General speedups. - Remove generic dead code elimination functionality from transforms: --eliminate-local-single-block --eliminate-local-single-store --eliminate-local-multi-store To recover the previous behaviour, a recipe using those transforms should now also invoke the --eliminate-dead-code-aggressive transform. - Improve folding, including coverage for floating point, OpSelect, and arithmetic with non-trivial constant operands. - Add loop-invariant code motion pass. - Add loop-unrolling pass, for honouring unroll hits. - Add loop-unswitch pass. - Add instruction simplification pass. - Aggressive dead code elimination: Understands capability hierarchy when finding instructions it can eliminate (combinators). (PR #1268) - CCP can now fold floating point arithmetic. #1311 - Validator: - Validate barrier instructions. - Check Vulkan-specific rules for atomics. - Check Vulkan prohibition of Location or Component decorations on BuiltIn variables. - Linker: - Add --verify-ids option - Add option to allow a resulting module to be partially linked. - Handle OpModuleProcessed (instructions in SPIR-V layout section 7c) - Fixes: - #1265: Optimizer: Fix use-after free bug in if-conversion. (Fix object lifecycle bug in type manager.) - #1282: Fix new warnings found by GCC 8.0.1. - #1285: Optimizer: Fix random failures during inlining. (Dangling references in DefUseManager) - #1295: Optimizer: Fix incorrect handling of Phi nodes in CCP. - #1300: Fix CCP: avoid bad CCP transitions and unsettled values. - #1304: Avoid static-duration variables of class type (with constructors). - #1323: Fix folding of an insert composite feeding a composite extract. - #1339: Fix CCP: Handle OpConstantNull boolean values as conditions. - #1341: DCEInst: Keep atomic instructions (and some others with side effects). - #1354: Don't fold integer division. - #1357: Support OpConstantNull in folding. - #1361: CCP: Fix handling of non-constant module-scope values v2018.0 2018-02-02 - General - VisualStudio 2013 is no longer supported. VisualStudio 2015 is supported. - Use "include/unified1" directory from SPIRV-Headers. Requires recent SPIRV-Headers source. - Disassembler: spirv-dis adds --color option to force color disassembly. - Optimizer: - Add pass to eliminate dead insertions. - Aggressive dead code elimination now removes OpSwitch constructs. - Block merging occurs in more cases. - Add driver workaround transform: replace OpUnreachable with harmless branch to merge. - Improve instruction folding framework. - Add loop analysis. - Add scalar replacement of aggregates to size-optimization recipe. - Add pass to replace instructions invalid for a shader stage, with a harmless value. This changes the semantics of the program! Not for general use! - Rearragne and add passes to performance-optimization recipe, to produce better results. - Validator: - Validate OpenCL extended instructions. - Shaders can't perform atomics on floats. - Validate memory semantics values in atomics. - Validate instruction-adjacency constraints, e.g. OpPhi predecessors, merge instructions immediately precede branches. - Fixes: - PR 1198: Optimizer: Fix CCP in presence of matrix constants. - #1199: Optimizer: Fix CCP: don't propagate spec constants. - #1203: Optimizer: Fix common uniform elim bug introduced by refactoring. - #1210: Optimizer: Aggressive dead code elimination: Fix 'break' identification. - #1212: Optimizer: Aggressive dead code elimination: Was skipping too many instructions. - #1214: Optimizer: Aggressive dead code elimination: Fix infinite loop. - #1228: Optimizer: Fix CCP: Handling of varying Phi nodes; was resulting in infinite loop. - #1245: Optimizer: Dead branch elimination: Avoid a null pointer dereference. - #1250: Optimizer: Dead branch elimination: Avoid spuriously reporting a change. v2017.3 2018-01-12 - General: - Support DebugInfo extended instruction set, targeted at OpenCL environments. See the SPIR-V Registry. - Generate a SPIRV-Tools.pc file for pkg-config. - Optimizer: - Progress for legalization of code generated from HLSL (issue #1118): - Add --legalize-hlsl option to run transforms used to transform intermediate code generated by HLSL to SPIR-V for Vulkan compilers. Those compilers normally run these transforms automatically. This option is used for developing those transforms. - Add Private-to-Function variable conversion for modules with logical addressing. - Add --ccp: SSA Conditional Constant Propagation (CCP) - Add --print-all to show disassembly for each optimization pass. - Internal: Add loop descriptors and post-order tree iterator. - Generalized dead branch elimination - Aggressive dead code elimination (ADCE) now removes dead functions and module-scope variables. - Vector extract/insert elimination now optimizes through some cases of VectorShuffle, and GLSL.std.450 Mix extended instruction. - Validator: - Add validation for GLSL.std.450 extended instruction set. - Check out of bounds composite accesses, where that's statically computable. Fixes #1112. - Check upper bits of literal numbers that aren't a multiple of 32-bits wide. - More validation of primitive instructions - Add optional "relaxed" checking logical addressing mode to permit some cases of pointer-to-pointer. Contributes to HLSL legalization (issue #1118). - Fixes: #1100: Validator: Image operand Sample can be used with OpImageSparseFetch, OpImageSparseRead. #1108: Remove duplicates transform was incorrectly removing non-duplicate decorations. #1111: Optimizer's type manager could reference deleted memory. #1112: Fix decoration equality check, e.g. it is now symmetric. #1129: Validator now disallows Dim=SupbassData for OpImageSparseRead. #1143: Fix CCP: Was generating incorrect code for loops. #1153: Fix CCP crash. #1154: Optimizer's internal instruction-to-block mappings were sometimes inconsistent. #1159: Fix CCP infinite loop. #1168: Fix dead branch elimination intermittently generating incorrect code. Fixes https://github.com/KhronosGroup/glslang/issues/1205 #1186: Fix validation of PackDouble2x32 and UnpackDouble2x32 v2017.2 2017-12-15 - General: - Support OpenCL 1.2, 2.0 target environments, including embedded profiles - Add CONTRIBUTING.md - Fix exit status code for spirv-link - Disassember: Enable emitting ANSI colour codes to a string - Library avoids polluting global namespace. The libraries can export C and C++ symbols starting with "spv", or in a C++ namespace. Add a test for this. - Linux release builds include debug information, for easier profiling - Build bots no longer test VisualStudio 2013 - Testing dependency RE2 requires VisualStudio 2015 or later - Build bots check code formatting - Optimizer: - Add --skip-validation to spirv-opt - Add dominance tree analysis - Add generic value propagation engine - Add global redundancy elimination within a function - Add scalar replacement of function-scope variables of composite type - Aggressive dead code elimination: Remove empty loops - Killing an instruction notifies the IRContext - IRContext::KillInst deletes the instruction - Move CFG analysis to IRContext - Add constant manager - Fix: Don't consider derivative instructions as combinators. - Fix: Don't delete an instruction twice in local dead-code-elimination - Fix: Don't consider derivative instructions as combinators. - Validator: - Finish checking of image instructions (Section 3.32.10) - Check sparse image instructions - Check OpTypeImage, OpTypeSampleImage - Check composite instructions (Section 3.32.12) - Check atomic instructions (Section 3.32.18) - Check OpEmitStreamVertex, OpEndStreamPrimitive instructions - Re-enable validation of OpCopyObject - OpKill, image ImplicitLod and QueryLod instructions can only be used in Fragment shaders. - Fixes for image instruction validation: - Lod image operand only usable with ExplicitLod and OpImageFetch - ExplicitLod Lod image operand must be float scalar - OpImageFectch Lod image operand must be int scalar - OpImageGather component operand must be 32-bits (integer scalar) - OpImageQuerySizeLod Lod must be integer scalar - Fixes: #622: Remove names and decorations when inlining #989: Aggressive dead code elim: Don't optimize away live breaks from a loop #991: Fix validation of SPV_AMD_shader_ballot #1004: Use after free of an instruction, in remove-duplicates transform #1007: OpImageRead not required to return 4-component vector #1009: OpImageRead can return scalar int/float types #1011: OpImageWrite should allow scalar int/float texel types #1012: Fix validat Dref type check #1017: Load-store elimination considers variable initializations #1034: Fix Windows debug build: operator< should be a weak ordering #1083: Inlining: Set parent (function) for each inlined basic block. #1075: Aggressive dead code elimination: Was leaving dangling references to removed blocks. v2017.1 2017-11-23 - Update README with details on the public_spirv_tools_dev@khronos.org mailing list. - General: - Automatically deploy built artifacts to GitHub Releases - Add a Linker (module combiner). Under development. - Add Android.mk for Android NDK builds. - Add the 'effcee' library as an optional dependency for use in tests. Eventually it will be a required dependency, once downstream projects have a chance to adjust. Requires 're2' library. - Avoid static-duration variables of class type (with constructors). - Hack around bugs in gcc-4.8.1 template handling - Faster opcode lookup - Validator: - Recognize extensions listed on SPIR-V registry, through #25 SPV_AMD_shader_fragment_mask - Validator issues an info message when it sees an unrecognized extension. - Type check basic arithmetic operations - Type check carry/extended arithmetic operations - Type check vector arithmetic operations - Type check Relational and Logical instructions - Type check Bit instructions - Check type uniqueness rules - Check conversion instructions - Check image instructions - Check derivative instructions - Check OpVectorShuffle - Check OpBranchConditional - OpModuleProcessed is only allowed after debug names section and before annotations section. - Checks the right kind of return is called for each function (void or non-void). - Add option to relax type check when storing structs (--relax-store-struct) - Optimizer: - Refactoring internal representation of the module, including: - IRContext: owns a module and manages analyses - Instructions are owned by intrusive lists, and have unique IDs - BasicBlock owns its instruction list. - DefUseManager: change representation of uses, for faster processing on large modules. - Add high level recipes: -O, -Os, and -Oconfig Recipes for -O and -Os are under development. - Add eliminate-dead-function transform - Add strength reduction transform: For now, convert multiply by power of 2 to a bit shift. - Add CFG cleanup transform - Add removal of dead module-scope variables - Add merge-return transform for modules without structured control flow - Add redundancy elimination within a basic block (local value numbering) - Extract-insert elimination: - Recognize the case where the first instruction in the sequence is an OpCompositeConstruct or OpConstantComposite - Handle some cases of nested structs - Dead branch elimination now can eliminate entire selection constructs when all arms are dead. - Compressing codec: - Updated algorithm to 1.01, 1.02, 1.03 - Not built by default. Use -DSPIRV_BUILD_COMPRESSION=ON to build. - Codec can be parameterized by a customized model. - Fixes: #728: Fix decoration of inlined functions #798: spirv-as should fail when given unrecognized long option #800: Inliner: Fix inlining function into header of multi-block loop #824: Eliminate-local-multi-store: Fix a crash #826: Elimiante-local-multi-store: Fix a crash #827: Fix crash when compact-ids transform runs before another transform. #834: Add Cmake option to build the compressing codec. Off by default. #911: Fix classification of Line and NoLine instructions v2017.0 2017-09-01 - Update README to describe that assembler, disassembler, and binary parser support are based on grammar files from the SPIRV-Headers repository. v2016.7 2017-09-01 - Add SPIR-V 1.2 - OpenCL 2.2 support is now based on SPIR-V 1.2 - Support AMD extensions in assembler, disassembler: SPV_AMD_gcn_shader SPV_AMD_shader_ballot SPV_AMD_shader_explicit_vertex_parameter SPV_AMD_shader_trinary_minmax SPV_AMD_gpu_shader_half_float SPV_AMD_texture_gather_bias_lod SPV_AMD_gpu_shader_int16 - Optimizer: Add support for: - Inline all function calls in entry points. - Flatten decoration groups. Fixes #602 - Id compaction (minimize Id bound). Fixes #624 - Eliminate redundant composite insert followed by extract - Simplify access chains to local variables - Eliminate local variables with a single store, if possible - Eliminate local variables with a several stores, if possible - Eliminate loads and stores in same block to local variables - Eliminate redundant insert/extract to composite values - Aggressive dead instruction elimination - Eliminate dead branches - Merge blocks when the second can only be preceded by the first - Eliminate ommon uniform loads - Assembler: Add option to preserve numeric ids. Fixes #625 - Add build target spirv-tools-vimsyntax to generate spvasm.vim, a SPIR-V assembly syntax file for Vim. - Version string: Allow overriding of wall clock timestamp with contents of environment variable SOURCE_DATE_EPOCH. - Validator implements relaxed rules for SPV_KHR_16bit_storage. - CMake installation rules use GNUInstallDirs. For example, libraries will be installed into a lib64 directory if that's the norm for the current system. - Fixes: #500: Parameterize validator limit checks #508: Support compilation under CYGWIN #517: Fix validation when continue (or case) contstruct is also the head of a nested control construct. #551: If a merge block is reachable, it must be *strictly* dominated by its header. #548: Validator: Error when the reserved OpImageSparseSampleProj* opcodes are used. #611: spvtools::Optimizer was failing to save the module to the output binary vector when all passes succeded without changes. #629: The inline-entry-points-all optimization could generate invalidly structured code when the inlined function had early returns. #697: Optimizer's Instruction::ForEachInId method was skipping semantics-id and scope-id. #755: Inliner: Fix inlining of callee with single Return appearing before the end of the function. #776: Fix dead branch elimination in presence of complex but dead control flow. #781: SPV_KHR_variable_pointers allows duplicate pointer types #782: Inliner: Fix remapping of non-label forward references in callee #787: Inliner: Fix remapping of inlined entry block when called from single block loop. #790: Inliner: Fix remapping of inlined entry block when callee has multiple returns. v2016.6 2016-12-13 - Published the C++ interface for assembling, disassembling, validation, and optimization. - Support SPV_KHR_shader_draw_parameters in assembler, disassembler, parser. - Validator: - Add validator API accepting raw binary words - Increased coverage: - Checks "Data rules" in Universal Validation Rules, section 2.16.1 - WIP: Universal Limits. - The minimum mandated upper bounds are checked. - TODO: Parameterize the validator to allow larger limits accepted by a more than minimally capable implementation. - OpSampledImage checks - OpConstantComposite checks - Id bound check - Disasssembler: - Generates friendly GLSL-based names for more builtin variables - Generates friendly names for numeric OpConstant values - Vendor tool info extracted from SPIR-V XML registry file. - Fixes issues: #429: Validator: Allow OpTypeForwardPointer and OpTypeStruct to reference undefined IDs #482: Validator: OpVariable initializer can be an ID of a module-scope variable v2016.5 2016-09-16 - Support SPV_KHR_shader_ballot in assembler, disassembler, parser. - Disassembler: Generate friendly names for built-in variables. - Partial fixes: #359: Add Emacs helper for automatically diassembling/assembling a SPIR-V binary on file load/save. - Fixes: #414: Validator: Allow OpUndef for composite constants #415: Validator: Phi can use its own value in some cases. v2016.4 2016-09-01 - Relicensed under Apache 2.0 - Add optimization passes (in API and spirv-opt command) - Fold spec constants defined with OpSpecConstantOp and OpSpecConstantComposite to normal constants with fixed value(s). - Fixes issues: #318: Relicensed under Apache 2.0 v2016.3 2016-08-24 - Add target environment enums for OpenCL 2.1, OpenCL 2.2, OpenGL 4.0, OpenGL 4.1, OpenGL 4.2, OpenGL 4.3, OpenGL 4.5. - Add spirv-cfg, an experimental tool to dump the control flow graph as a GraphiViz "dot" graph - Add optimization pass: Eliminate dead constants. - Add spirv-lesspipe.sh filter utility - Fixes issues: #288: Check def-use dominance rules for OpPhi (variable,parent) operands #339: Allow OpUndef in types-constants-global-vars section, as required by SPIR-V 1.0 Rev7, 1.1 Rev 3. #340: Avoid race on mkdir during build #365: Relax PointSize, ClipDistance, CullDistance capability check in all environments not just Vulkan 1.0. v2016.2 2016-08-05 - Validator is incomplete - Checks ID use block is dominated by definition block - Add optimization passes (in API and spirv-opt command) - Strip debug info instructions - Freeze spec constant to their default values - Allow INotEqual as operation for OpSpecConstantOp - Fixes bugs: #270: validator: crash when continue construct is unreachable #279: validator: infinite loop when analyzing some degenerate control flow graphs #286: validator: don't incorrectly generate def-use error for (variable,parent) parameters to OpPhi #290: disassembler: never generate bare % for an identifier #295: validator: def-use dominance check should ignore unreachable uses #276: validator: allow unreachable continue constructs #297: validator: allow an unreachable block to branch to a reachable merge block v2016.1 2016-07-19 - Fix https://github.com/KhronosGroup/SPIRV-Tools/issues/261 Turn off ClipDistance and CullDistance capability checks for Vulkan. - The disassembler can emit friendly names based on debug info (OpName instructions), and will infer somewhat friendly names for most types. This is turned on by default for the spirv-dis command line tool. - Updated to support SPIR-V 1.1 rev 2 - Input StorageClass, Sampled1D capability, and SampledBuffer capability do not require Shader capability anymore. v2016.0 2016-07-04 - Adds v<year>.<index> versioning, with "-dev" indicating work in progress. The intent is to more easly report and summarize functionality when SPIRV-Tools is incorporated in downstream projects. - Summary of functionality (See the README.md for more): - Supports SPIR-V 1.1 Rev 1 - Supports SPIR-V 1.0 Rev 5 - Supports GLSL std450 extended instructions 1.0 Rev 3 - Supports OpenCL extended instructions 1.0 Rev 2 - Assembler, disassembler are complete - Supports floating point widths of 16, 32, 64 bits - Supports integer widths up to 64 bits - Validator is incomplete - Checks capability requirements in most cases - Checks module layout constraints - Checks ID use-definition ordering constraints, ignoring control flow - Checks some control flow graph rules - Optimizer is introduced, with few available transforms. - Supported on Linux, OSX, Android, Windows - Fixes bugs: - #143: OpenCL pow and pown arguments