Showing preview only (9,895K chars total). Download the full file or copy to clipboard to get everything.
Repository: HansKristian-Work/dxil-spirv
Branch: master
Commit: 62dbb07f7715
Files: 2195
Total size: 9.0 MB
Directory structure:
gitextract_06b8vcw_/
├── .clang-format
├── .gitattributes
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── DESCRIPTORS.md
├── LICENSE.MIT
├── README.md
├── bc/
│ ├── CMakeLists.txt
│ ├── cast.hpp
│ ├── context.cpp
│ ├── context.hpp
│ ├── data_structures.hpp
│ ├── disassembler.cpp
│ ├── function.cpp
│ ├── function.hpp
│ ├── instruction.cpp
│ ├── instruction.hpp
│ ├── iterator.hpp
│ ├── metadata.cpp
│ ├── metadata.hpp
│ ├── module.cpp
│ ├── module.hpp
│ ├── module_dxbc_ir.cpp
│ ├── type.cpp
│ ├── type.hpp
│ ├── value.cpp
│ └── value.hpp
├── build_dxc.sh
├── cfg_structurizer.cpp
├── cfg_structurizer.hpp
├── checkout_dxc.sh
├── checkout_llvm.sh
├── copy_reference_shaders.py
├── debug/
│ ├── logging.cpp
│ └── logging.hpp
├── descriptor_qa.cpp
├── descriptor_qa.hpp
├── dxbc_spirv_sandbox.cpp
├── dxil-disasm.py
├── dxil.hpp
├── dxil_converter.cpp
├── dxil_converter.hpp
├── dxil_extract.cpp
├── dxil_parser.cpp
├── dxil_parser.hpp
├── dxil_spirv.cpp
├── dxil_spirv_c.cpp
├── dxil_spirv_c.h
├── external/
│ └── CMakeLists.txt
├── format_all.sh
├── ir.hpp
├── link.T
├── llvm_bitcode_parser.cpp
├── llvm_bitcode_parser.hpp
├── memory_stream.cpp
├── memory_stream.hpp
├── meson.build
├── misc/
│ └── structurize_test.cpp
├── node.cpp
├── node.hpp
├── node_pool.cpp
├── node_pool.hpp
├── opcodes/
│ ├── converter_impl.hpp
│ ├── dxil/
│ │ ├── dxil_ags.cpp
│ │ ├── dxil_ags.hpp
│ │ ├── dxil_arithmetic.cpp
│ │ ├── dxil_arithmetic.hpp
│ │ ├── dxil_buffer.cpp
│ │ ├── dxil_buffer.hpp
│ │ ├── dxil_common.cpp
│ │ ├── dxil_common.hpp
│ │ ├── dxil_compute.cpp
│ │ ├── dxil_compute.hpp
│ │ ├── dxil_geometry.cpp
│ │ ├── dxil_geometry.hpp
│ │ ├── dxil_mesh.cpp
│ │ ├── dxil_mesh.hpp
│ │ ├── dxil_nvapi.cpp
│ │ ├── dxil_nvapi.hpp
│ │ ├── dxil_pixel_ops.cpp
│ │ ├── dxil_pixel_ops.hpp
│ │ ├── dxil_ray_tracing.cpp
│ │ ├── dxil_ray_tracing.hpp
│ │ ├── dxil_resources.cpp
│ │ ├── dxil_resources.hpp
│ │ ├── dxil_sampling.cpp
│ │ ├── dxil_sampling.hpp
│ │ ├── dxil_tessellation.cpp
│ │ ├── dxil_tessellation.hpp
│ │ ├── dxil_waveops.cpp
│ │ ├── dxil_waveops.hpp
│ │ ├── dxil_workgraph.cpp
│ │ └── dxil_workgraph.hpp
│ ├── opcodes.hpp
│ ├── opcodes_dxil_builtins.cpp
│ ├── opcodes_dxil_builtins.hpp
│ ├── opcodes_llvm_builtins.cpp
│ └── opcodes_llvm_builtins.hpp
├── pkg-config/
│ └── dxil-spirv-c-shared.pc.in
├── reference/
│ └── shaders/
│ ├── ags/
│ │ ├── ags.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.full-wmma.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.ssbo.comp
│ │ ├── cs_wmma_alloca.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_extract_insert.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_at.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_bt.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ct.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ot.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f32.sm66.ssbo.comp
│ │ ├── cs_wmma_fp16_fp8_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp16_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp8_conversions.sm66.ssbo.nv-coopmat2.comp
│ │ ├── cs_wmma_fp8_fp32_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_lds_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_matrix_length.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.full-wmma.sm66.ssbo.comp
│ │ └── cs_wmma_store_phi.sm66.ssbo.comp
│ ├── alloca-opts/
│ │ ├── bad-stride.frag
│ │ ├── double-array-load.frag
│ │ ├── float4-array-load.bindless.frag
│ │ ├── float4-array-load.bindless.root-constants.frag
│ │ ├── float4-array-load.frag
│ │ ├── float4-array-load.root-constant.frag
│ │ ├── float4-array-load.root-descriptor.frag
│ │ ├── float4-array-load.root-descriptor.root-constants.frag
│ │ ├── load-different.frag
│ │ ├── local-root-constants.local-root-signature.rgen
│ │ ├── matrix-load.frag
│ │ ├── missing-first.frag
│ │ ├── missing-last-element.frag
│ │ ├── out-of-order-load.frag
│ │ ├── store-after-load.frag
│ │ └── uint4-array-load.frag
│ ├── asm/
│ │ ├── bfi.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps-single-alias.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps.bc.dxil
│ │ ├── constant-struct-aggregate.bc.dxil
│ │ ├── control-flow-multi-break-with-non-idom-loop-header.dxil
│ │ ├── ibfe.bc.dxil
│ │ └── ubfe.bc.dxil
│ ├── auto-barrier/
│ │ ├── complex-loop.auto-group-shared-barrier.comp
│ │ ├── inner-to-inner.auto-group-shared-barrier.comp
│ │ ├── inner-to-outer.auto-group-shared-barrier.comp
│ │ ├── outer-to-inner.auto-group-shared-barrier.comp
│ │ ├── single-block-loop.auto-group-shared-barrier.comp
│ │ └── single-block.auto-group-shared-barrier.comp
│ ├── control-flow/
│ │ ├── branch-return-2.comp
│ │ ├── branch-return.comp
│ │ ├── branch.comp
│ │ ├── conditional-break-into-if-else-if-ladder-2.comp
│ │ ├── conditional-break-into-if-else-if-ladder.comp
│ │ ├── dual-inner-loop-early-return.comp
│ │ ├── if-else-if-into-continue.comp
│ │ ├── inner-loop-early-return.comp
│ │ ├── interleaved-unrolled-loop-breaks.comp
│ │ ├── loop-break-2.comp
│ │ ├── loop-break.comp
│ │ ├── loop-continue-2.comp
│ │ ├── loop-continue-3.comp
│ │ ├── loop-continue.comp
│ │ ├── loop-inside-infinite-loop-2.frag
│ │ ├── loop-inside-infinite-loop.frag
│ │ ├── loop-return.comp
│ │ ├── loop.comp
│ │ ├── nested-loop-break-2.comp
│ │ ├── nested-loop-break.comp
│ │ ├── nested-loop.comp
│ │ ├── selection-merge-split-post-domination.frag
│ │ ├── switch-continue.frag
│ │ ├── switch-merge-into-other-merge.comp
│ │ ├── switch-shared-header-with-loop.comp
│ │ └── wave-size-dependent-loop-unroll.comp
│ ├── descriptor_qa/
│ │ ├── acceleration-structure.bindless.descriptor-qa.rgen
│ │ ├── acceleration-structure.bindless.descriptor-qa.sm66.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.descriptor-qa.rgen
│ │ ├── descriptor_qa.bindless.cbv-as-ssbo.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.sm66.comp
│ │ ├── descriptor_qa.bindless.ssbo.descriptor-qa.comp
│ │ ├── early-2.bindless.descriptor-qa.frag
│ │ ├── early-3.bindless.descriptor-qa.frag
│ │ ├── early-4.bindless.descriptor-qa.frag
│ │ ├── early-5.bindless.descriptor-qa.frag
│ │ ├── early-heap.descriptor-qa.sm66.frag
│ │ └── early.bindless.descriptor-qa.frag
│ ├── dxil-builtin/
│ │ ├── accept-hit-and-end-search-ignore-hit.rany
│ │ ├── acos.frag
│ │ ├── asin.frag
│ │ ├── atan.frag
│ │ ├── atomic-bin-op.bindless.root-constant.frag
│ │ ├── atomic-bin-op.frag
│ │ ├── atomic-bin-op.root-descriptor.comp
│ │ ├── atomic-bin-op.ssbo.frag
│ │ ├── atomic-compare-exchange.frag
│ │ ├── atomic-compare-exchange.root-descriptor.comp
│ │ ├── atomic-compare-exchange.ssbo.frag
│ │ ├── attributes.denorm-ftz.comp
│ │ ├── attributes.denorm-preserve.comp
│ │ ├── barrier.comp
│ │ ├── barycentrics-2.frag
│ │ ├── barycentrics.frag
│ │ ├── bfrev.frag
│ │ ├── bitcount-bitrev-sizes.ssbo.comp
│ │ ├── buffer-load-feedback.frag
│ │ ├── buffer-load-signed-feedback.frag
│ │ ├── buffer-load-signed.frag
│ │ ├── buffer-load.frag
│ │ ├── buffer-load.ssbo.frag
│ │ ├── buffer-store-signed.frag
│ │ ├── buffer-store.frag
│ │ ├── buffer-store.ssbo.frag
│ │ ├── buffer-update-counter.frag
│ │ ├── calculate-lod.frag
│ │ ├── call-shader.rgen
│ │ ├── clip.demote-to-helper.frag
│ │ ├── clip.frag
│ │ ├── compute-shader-derivatives-cube-array.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-cube.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-single-thread.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives.noderivs.sm66.ssbo.comp
│ │ ├── cos.frag
│ │ ├── countbits.frag
│ │ ├── coverage.frag
│ │ ├── derivative.frag
│ │ ├── derivative.sm60.frag
│ │ ├── derivative.sm60.native-fp16.frag
│ │ ├── derivatives.sm66.comp
│ │ ├── discard.demote-to-helper.frag
│ │ ├── discard.frag
│ │ ├── dispatch-rays-dimensions.rgen
│ │ ├── dispatch-rays-index.rgen
│ │ ├── dot2.frag
│ │ ├── dot3.frag
│ │ ├── dot4.frag
│ │ ├── eval-centroid.frag
│ │ ├── eval-sample-index.frag
│ │ ├── eval-snapped.frag
│ │ ├── exp.frag
│ │ ├── f16-to-f32.frag
│ │ ├── f32-to-f16.frag
│ │ ├── fabs.frag
│ │ ├── firstbithi-16.sm62.frag
│ │ ├── firstbithi-64.frag
│ │ ├── firstbithi.frag
│ │ ├── firstbitlo-16.sm62.frag
│ │ ├── firstbitlo-64.frag
│ │ ├── firstbitlo.frag
│ │ ├── firstbitshi-16.sm62.frag
│ │ ├── firstbitshi-64.frag
│ │ ├── firstbitshi.frag
│ │ ├── flattened_thread_id_in_group.comp
│ │ ├── fma.frag
│ │ ├── fmad-precise.frag
│ │ ├── fmad.frag
│ │ ├── fmax.frag
│ │ ├── fmin.frag
│ │ ├── frc.frag
│ │ ├── get-dimensions-w-only.frag
│ │ ├── get-dimensions-xyz-only.frag
│ │ ├── get-dimensions.bindless.root-constant.frag
│ │ ├── get-dimensions.bindless.root-constant.ssbo.frag
│ │ ├── get-dimensions.frag
│ │ ├── get-dimensions.ssbo.frag
│ │ ├── group_id.comp
│ │ ├── hcos.frag
│ │ ├── hsin.frag
│ │ ├── htan.frag
│ │ ├── imad.frag
│ │ ├── imax.frag
│ │ ├── imin.frag
│ │ ├── instance-id.vert
│ │ ├── is-helper-lane-2.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane-2.sm66.frag
│ │ ├── is-helper-lane.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane.sm66.frag
│ │ ├── isfinite.frag
│ │ ├── isinf.frag
│ │ ├── isnan.frag
│ │ ├── log.frag
│ │ ├── make-double.frag
│ │ ├── msaa-uav.sm67.comp
│ │ ├── msad.comp
│ │ ├── object-ray-direction.rany
│ │ ├── object-ray-origin.rany
│ │ ├── object-to-world-3x4.rany
│ │ ├── object-to-world-4x3.rany
│ │ ├── pack-unpack.ssbo.sm66.comp
│ │ ├── quad-all-any.sm67.comp
│ │ ├── quad-all-any.sm67.quad-maximal-reconvergence.noglsl.comp
│ │ ├── quad-read-at-2d.comp
│ │ ├── quad-read-at-2d.sm66.comp
│ │ ├── quad-read-at.comp
│ │ ├── quad-read-at.frag
│ │ ├── quad-swap.comp
│ │ ├── quad-swap.frag
│ │ ├── raw-gather-offset-sparse.sm67.ssbo.comp
│ │ ├── raw-gather-offset.sm67.ssbo.comp
│ │ ├── raw-gather-sparse.sm67.ssbo.comp
│ │ ├── raw-gather.sm67.ssbo.comp
│ │ ├── ray-query-phi-multi.invalid.sm66.comp
│ │ ├── ray-query-phi-simple.sm66.comp
│ │ ├── ray-query-select-multi.invalid.sm66.comp
│ │ ├── ray-query-select-simple.sm66.comp
│ │ ├── ray-query-store-multi.invalid.sm66.comp
│ │ ├── ray-query-store-simple.sm66.comp
│ │ ├── ray-query.comp
│ │ ├── ray-t-current.rany
│ │ ├── ray-t-min.rany
│ │ ├── render-target-sample-count.frag
│ │ ├── render-target-sample-position.frag
│ │ ├── report-hit.rint
│ │ ├── round-ne.frag
│ │ ├── round-ni.frag
│ │ ├── round-pi.frag
│ │ ├── round-z.frag
│ │ ├── rsqrt.frag
│ │ ├── rt-geometry-index.rany
│ │ ├── rt-hit-kind.rany
│ │ ├── rt-instance-id.rany
│ │ ├── rt-instance-index.rany
│ │ ├── rt-primitive-index.rany
│ │ ├── rt-ray-flags.rany
│ │ ├── sample-bias-feedback.frag
│ │ ├── sample-bias-offset.frag
│ │ ├── sample-bias.frag
│ │ ├── sample-cmp-bias-feedback.frag
│ │ ├── sample-cmp-bias-offset.frag
│ │ ├── sample-cmp-bias.frag
│ │ ├── sample-cmp-feedback.frag
│ │ ├── sample-cmp-grad-offset-feedback.frag
│ │ ├── sample-cmp-grad-offset.frag
│ │ ├── sample-cmp-grad.frag
│ │ ├── sample-cmp-level.sm67.noglsl.frag
│ │ ├── sample-cmp-levelzero.frag
│ │ ├── sample-cmp-offset-levelzero-feedback.frag
│ │ ├── sample-cmp-offset-levelzero.frag
│ │ ├── sample-cmp-offset.frag
│ │ ├── sample-cmp.frag
│ │ ├── sample-grad-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-grad-offset-feedback.frag
│ │ ├── sample-grad-offset.frag
│ │ ├── sample-grad.frag
│ │ ├── sample-id.frag
│ │ ├── sample-level-offset-feedback.frag
│ │ ├── sample-level-offset.frag
│ │ ├── sample-level.frag
│ │ ├── sample-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-offset.frag
│ │ ├── sample.frag
│ │ ├── saturate.frag
│ │ ├── sin.frag
│ │ ├── sm64-packed-arithmetic.ssbo.comp
│ │ ├── sm64-packed-arithmetic.ssbo.i8dot.noglsl.comp
│ │ ├── sm64-packed-arithmetic.ssbo.mixed-float-dot-product.noglsl.comp
│ │ ├── split-double.frag
│ │ ├── sqrt.frag
│ │ ├── tan.frag
│ │ ├── texture-gather-4offset.frag
│ │ ├── texture-gather-cmp-offset-feedback.frag
│ │ ├── texture-gather-cmp-offset.frag
│ │ ├── texture-gather-cmp.frag
│ │ ├── texture-gather-offset.frag
│ │ ├── texture-gather-signed-feedback.frag
│ │ ├── texture-gather-signed.frag
│ │ ├── texture-gather.frag
│ │ ├── texture-load-feedback.frag
│ │ ├── texture-load-offset-dynamic.sm67.frag
│ │ ├── texture-load-offset.frag
│ │ ├── texture-load-signed.frag
│ │ ├── texture-load.frag
│ │ ├── texture-store-signed.frag
│ │ ├── texture-store.frag
│ │ ├── texture2dms-sample-position.frag
│ │ ├── thread_id.comp
│ │ ├── thread_id_in_group.comp
│ │ ├── trace-ray-flags-2.rgen
│ │ ├── trace-ray-flags.rgen
│ │ ├── trace-ray.rgen
│ │ ├── umad.frag
│ │ ├── umax.frag
│ │ ├── umin.frag
│ │ ├── vertex-id.vert
│ │ ├── wave-active-all-true.comp
│ │ ├── wave-active-all-true.frag
│ │ ├── wave-active-any-true.comp
│ │ ├── wave-active-any-true.frag
│ │ ├── wave-active-ballot-discard.demote-to-helper.frag
│ │ ├── wave-active-ballot-discard.frag
│ │ ├── wave-active-ballot.comp
│ │ ├── wave-active-ballot.demote-to-helper.frag
│ │ ├── wave-active-ballot.frag
│ │ ├── wave-active-count-bits.comp
│ │ ├── wave-active-count-bits.frag
│ │ ├── wave-all-equal.comp
│ │ ├── wave-all-equal.frag
│ │ ├── wave-get-lane-count.comp
│ │ ├── wave-get-lane-index.comp
│ │ ├── wave-is-first-lane.comp
│ │ ├── wave-is-first-lane.frag
│ │ ├── wave-match.comp
│ │ ├── wave-match.frag
│ │ ├── wave-match.partitioned.noglsl.comp
│ │ ├── wave-match.partitioned.noglsl.frag
│ │ ├── wave-multi-prefix-count-bits.comp
│ │ ├── wave-multi-prefix-count-bits.frag
│ │ ├── wave-multi-prefix-op.comp
│ │ ├── wave-multi-prefix-op.frag
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.comp
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.frag
│ │ ├── wave-prefix.comp
│ │ ├── wave-prefix.frag
│ │ ├── wave-read-lane-at-optimizations.comp
│ │ ├── wave-read-lane-at.comp
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.frag
│ │ ├── wave-reduce-helpers.sm67.frag
│ │ ├── wave-reduce-helpers.sm67.quad-maximal-reconvergence.frag
│ │ ├── wave-reduce.comp
│ │ ├── wave-reduce.frag
│ │ ├── wave-size.sm66.comp
│ │ ├── world-ray-direction.rany
│ │ ├── world-ray-origin.rany
│ │ ├── world-to-object-3x4.rany
│ │ └── world-to-object-4x3.rany
│ ├── fp16/
│ │ ├── saturate.frag
│ │ ├── saturate.sm60.frag
│ │ └── saturate.sm60.native-fp16.frag
│ ├── heap-robustness/
│ │ ├── misc.bindless.heap-raw-va-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.heap-robustness-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.sm66.ssbo.comp
│ │ ├── misc.bindless.sm66.ssbo.comp
│ │ └── misc.heap-robustness.bindless.heap-robustness-cbv.heap-raw-va-cbv.sm66.ssbo.comp
│ ├── instrumentation/
│ │ ├── atomics-raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured-counter.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-typed.bindless.bda-instrumentation.ssbo.comp
│ │ ├── cbv.bindless.bda-instrumentation.comp
│ │ ├── cbv.root-descriptor.bda-instrumentation.comp
│ │ ├── raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── structured.bindless.bda-instrumentation.comp
│ │ ├── structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ └── typed.bindless.bda-instrumentation.comp
│ ├── llvm-builtin/
│ │ ├── alloca-robustness-cases.extended-robustness.vert
│ │ ├── alloca.frag
│ │ ├── atomic-bin-op.comp
│ │ ├── atomic-compare-exchange.comp
│ │ ├── atomic-compare-exchange.sm66.ssbo.comp
│ │ ├── bool-to-fp.frag
│ │ ├── constant-expression-cast.comp
│ │ ├── constant-expression-gep.comp
│ │ ├── fadd.frag
│ │ ├── fast-mul-div-pair.comp
│ │ ├── fcmp_eq.frag
│ │ ├── fcmp_ge.frag
│ │ ├── fcmp_gt.frag
│ │ ├── fcmp_le.frag
│ │ ├── fcmp_lt.frag
│ │ ├── fcmp_ne.frag
│ │ ├── fdiv.frag
│ │ ├── fmul.frag
│ │ ├── frem.frag
│ │ ├── fsub.frag
│ │ ├── glitched-integer-width.comp
│ │ ├── groupshared.comp
│ │ ├── icmp_eq.frag
│ │ ├── icmp_ne.frag
│ │ ├── icmp_sge.frag
│ │ ├── icmp_sgt.frag
│ │ ├── icmp_sle.frag
│ │ ├── icmp_slt.frag
│ │ ├── icmp_uge.frag
│ │ ├── icmp_ugt.frag
│ │ ├── icmp_ule.frag
│ │ ├── icmp_ult.frag
│ │ ├── logical-and.frag
│ │ ├── logical-equal.frag
│ │ ├── logical-not-equal.frag
│ │ ├── logical-or.frag
│ │ ├── lut.frag
│ │ ├── min16-phi.sm60.comp
│ │ ├── precise_math.frag
│ │ └── zext-bool.frag
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.comp
│ │ ├── uav-coherent-promotion.ssbo.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.comp
│ │ ├── uav-coherent.sm66.ssbo.comp
│ │ └── uav-coherent.ssbo.comp
│ ├── nvapi/
│ │ ├── bringup.nvapi.ssbo.rgen
│ │ ├── get-special-global-timer.nvapi.ssbo.rgen
│ │ ├── hit-object.local-root-signature.noglsl.nvapi.ssbo.rgen
│ │ ├── ray-query-cluster-id.nvapi.comp
│ │ ├── rt-cluster-id.nvapi.rany
│ │ └── shuffle.nvapi.ssbo.comp
│ ├── opts/
│ │ ├── fp16-fp32-fp16-1.ssbo.comp
│ │ ├── sabs.frag
│ │ ├── sneg.frag
│ │ ├── wave-read-lane-first-heap.sm66.comp
│ │ ├── wave-read-lane-first.bindless.local-root-signature.rmiss
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.sm60.comp
│ │ ├── wave-read-lane-first.sm60.comp
│ │ ├── wave-read-lane-first.sm66.comp
│ │ ├── wave-read-lane-first.ssbo.comp
│ │ ├── wave-read-lane-first.ssbo.rgen
│ │ ├── wave-read-lane-first.ssbo.sm60.comp
│ │ ├── wave-read-lane-first.ssbo.sm66.comp
│ │ └── wave-read-lane-first.ssbo.sm66.rgen
│ ├── raw-access/
│ │ ├── bab-double1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-half1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-uint1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint3.raw-access-chains.noglsl.ssbo.comp
│ │ └── structured-uint4.raw-access-chains.noglsl.ssbo.comp
│ ├── resources/
│ │ ├── acceleration-structure.bindless.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.raw-va-stride-offset.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.rgen
│ │ ├── acceleration-structure.local-root-signature.root-descriptor.rgen
│ │ ├── basic.input-attachment.frag
│ │ ├── buffer-16bit.ssbo.bindless.comp
│ │ ├── buffer-16bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-16bit.ssbo.comp
│ │ ├── buffer-64bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-64bit.ssbo.comp
│ │ ├── buffer-alignment-fixup.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── cbuf.root-constant.min16float.sm60.frag
│ │ ├── cbuf.root-constant.min16float.sm60.native-fp16.frag
│ │ ├── cbuf.root-constant.min16int.sm60.frag
│ │ ├── cbuf.root-constant.min16int.sm60.native-fp16.frag
│ │ ├── cbv-array-nonuniform.frag
│ │ ├── cbv-array.frag
│ │ ├── cbv-dynamic.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv-indexing.frag
│ │ ├── cbv-indexing.sm66.frag
│ │ ├── cbv-legacy-fp16-fp64.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.native-fp16.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.native-fp16.frag
│ │ ├── cbv.bindless.root-constant.cbv-as-ssbo.frag
│ │ ├── cbv.bindless.root-constant.frag
│ │ ├── cbv.frag
│ │ ├── cbv.no-legacy-cbuf-layout.bindless.frag
│ │ ├── cbv.no-legacy-cbuf-layout.index-divider.frag
│ │ ├── cbv.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv.no-legacy-cbuf-layout.native-fp16.sm60.frag
│ │ ├── cbv.no-legacy-cbuf-layout.root-constant.frag
│ │ ├── cbv.root-constant.frag
│ │ ├── cbv.root-descriptor.no-legacy-cbuf-layout.frag
│ │ ├── combined-image-sampler-reuse.frag
│ │ ├── dynamic-root-constant.root-constant.bindless.root-descriptor.comp
│ │ ├── min16-alloca-groupshared.sm60.comp
│ │ ├── min16float-ssbo-dxr.ssbo.rgen
│ │ ├── raw-buffer-addressing.comp
│ │ ├── raw-buffer-addressing.ssbo.comp
│ │ ├── root-bda.root-descriptor.comp
│ │ ├── root-bda.root-descriptor.sm60.comp
│ │ ├── root-constant-with-bda.root-descriptor.root-constant.comp
│ │ ├── rt-resources.bindless.local-root-signature.rmiss
│ │ ├── rt-resources.bindless.rmiss
│ │ ├── rt-resources.rmiss
│ │ ├── sampler-array.frag
│ │ ├── sampler-indexing.frag
│ │ ├── sampler-indexing.sm66.frag
│ │ ├── sampler.bindless.root-constant.frag
│ │ ├── sm66/
│ │ │ ├── atomics-64bit-groupshared.ssbo.sm66.comp
│ │ │ ├── atomics-64bit.root-descriptor.sm66.comp
│ │ │ ├── atomics-64bit.ssbo.sm66.comp
│ │ │ ├── atomics-component-alias.sm66.comp
│ │ │ ├── atomics-typed-64bit-heap.sm66.comp
│ │ │ ├── atomics-typed-64bit.bindless.sm66.comp
│ │ │ ├── atomics-typed-64bit.sm66.comp
│ │ │ ├── binding-range-selection.bindless.sm66.comp
│ │ │ ├── binding-range-selection.sm66.comp
│ │ │ ├── buffer-64bit-double.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.ssbo-align.sm66.comp
│ │ │ ├── cbuffer-heap.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.bindless.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.sm66.frag
│ │ │ ├── raw-buffer-heap.sm66.frag
│ │ │ ├── raw-buffer-heap.ssbo.sm66.frag
│ │ │ ├── raw-buffer-heap.typed-buffer-offset.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.ssbo-align.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.sm66.frag
│ │ │ ├── raygen-heap.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.sm66.rgen
│ │ │ ├── raygen.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.sm66.rgen
│ │ │ ├── rw-typed-binding.sm66.frag
│ │ │ ├── rw-typed-heap.sm66.frag
│ │ │ ├── sampled-types-binding.sm66.frag
│ │ │ ├── sampled-types.sm66.frag
│ │ │ ├── sampler-binding.sm66.frag
│ │ │ ├── sampler-heap.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.ssbo-align.sm66.frag
│ │ │ ├── structured-buffer-heap.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.ssbo-align.sm66.frag
│ │ │ └── structured-buffer-heap.typed-buffer-offset.sm66.frag
│ │ ├── srv-array-raw-buffer-nonuniform.frag
│ │ ├── srv-array-raw-buffer.frag
│ │ ├── srv-array-structured-buffer-nonuniform.frag
│ │ ├── srv-array-structured-buffer.frag
│ │ ├── srv-array-texture-nonuniform.frag
│ │ ├── srv-array-texture.frag
│ │ ├── srv-array-typed-buffer-nonuniform.frag
│ │ ├── srv-array-typed-buffer.frag
│ │ ├── srv-indexing.frag
│ │ ├── srv-indexing.sm66.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-raw-buffer.ssbo.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-structured-buffer.ssbo.frag
│ │ ├── srv-texture.bindless.root-constant.frag
│ │ ├── srv-texture.bindless.root-constant.inline-ubo.frag
│ │ ├── srv-typed-buffer.bindless.root-constant.frag
│ │ ├── srv-uav-raw.typed-buffer-offset.comp
│ │ ├── srv-uav.typed-buffer-offset.comp
│ │ ├── ssbo-minprecision.sm60.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.root-descriptor.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.root-descriptor.frag
│ │ ├── subobject-parsing.rgen
│ │ ├── typed-resources-16bit-sparse.frag
│ │ ├── typed-resources-16bit.bindless.frag
│ │ ├── typed-resources-16bit.frag
│ │ ├── typed-resources-16bit.sm60.bindless.frag
│ │ ├── typed-resources-16bit.sm60.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.bindless.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.frag
│ │ ├── uav-array-raw-buffer-nonuniform.frag
│ │ ├── uav-array-raw-buffer.frag
│ │ ├── uav-array-structured-buffer-nonuniform.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.bindless.root-constant.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.frag
│ │ ├── uav-array-structured-buffer.frag
│ │ ├── uav-array-texture-nonuniform.frag
│ │ ├── uav-array-texture.frag
│ │ ├── uav-array-typed-buffer-nonuniform.frag
│ │ ├── uav-array-typed-buffer.frag
│ │ ├── uav-counter-array.ssbo.frag
│ │ ├── uav-counter-array.ssbo.sm66.frag
│ │ ├── uav-counter-array.ssbo.sm66.uav-counter-ssbo.frag
│ │ ├── uav-counter-array.ssbo.uav-counter-ssbo.frag
│ │ ├── uav-counter-heap.sm66.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-ssbo.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-texel-buffer.bindless.ssbo.frag
│ │ ├── uav-counter.bindless.nobda.root-constant.comp
│ │ ├── uav-counter.bindless.nobda.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.heap-raw-va-cbv.comp
│ │ ├── uav-counter.bindless.root-constant.uav-counter-ssbo.comp
│ │ ├── uav-counter.ssbo.comp
│ │ ├── uav-counter.ssbo.raw-va-stride-offset.comp
│ │ ├── uav-counter.ssbo.uav-counter-ssbo.comp
│ │ ├── uav-indexing.frag
│ │ ├── uav-indexing.sm66.frag
│ │ ├── uav-raw-buffer.bindless.root-constant.frag
│ │ ├── uav-raw-buffer.ssbo.frag
│ │ ├── uav-structured-buffer.bindless.root-constant.frag
│ │ ├── uav-typed-buffer.bindless.root-constant.frag
│ │ └── uav-typed.typed-uav-without-format.comp
│ ├── rov/
│ │ ├── rov-bab.bindless.frag
│ │ ├── rov-bab.frag
│ │ ├── rov-bab.ssbo.bindless.frag
│ │ ├── rov-bab.ssbo.frag
│ │ ├── rov-bab.ssbo.root-descriptor.frag
│ │ ├── rov-branch-early-return.frag
│ │ ├── rov-branch.frag
│ │ ├── rov-buffer.frag
│ │ ├── rov-inloop-2.frag
│ │ ├── rov-inloop.frag
│ │ ├── rov-per-sample.sm66.frag
│ │ ├── rov-postloop.frag
│ │ ├── rov-structured.bindless.frag
│ │ ├── rov-structured.frag
│ │ ├── rov-structured.ssbo.bindless.frag
│ │ ├── rov-structured.ssbo.frag
│ │ ├── rov-structured.ssbo.root-descriptor.frag
│ │ ├── rov-tex1d.bindless.frag
│ │ ├── rov-tex1d.frag
│ │ ├── rov-tex1darray.bindless.frag
│ │ ├── rov-tex1darray.frag
│ │ ├── rov-tex2d.bindless.frag
│ │ ├── rov-tex2d.frag
│ │ ├── rov-tex2darray.bindless.frag
│ │ ├── rov-tex2darray.frag
│ │ ├── rov-tex3d.bindless.frag
│ │ ├── rov-tex3d.frag
│ │ ├── rov-undef.frag
│ │ └── rov.sm66.frag
│ ├── sampler-feedback/
│ │ ├── sampler-feedback.frag
│ │ └── sampler-feedback.sm66.frag
│ ├── semantics/
│ │ ├── clip-cull-distance.vert
│ │ ├── clip-cull.frag
│ │ ├── clip-distance-cols.frag
│ │ ├── clip-distance-cols.vert
│ │ ├── clip-distance-flatten.frag
│ │ ├── clip-distance-flatten.vert
│ │ ├── clip-distance-rows.frag
│ │ ├── clip-distance-rows.vert
│ │ ├── clip-distance-single.vert
│ │ ├── coverage.frag
│ │ ├── depth-greater-equal.frag
│ │ ├── depth-less-equal.frag
│ │ ├── depth.frag
│ │ ├── early-depth-stencil.frag
│ │ ├── inner-coverage.noglsl.frag
│ │ ├── is-front-face.frag
│ │ ├── position-short.frag
│ │ ├── position-short.vert
│ │ ├── position.frag
│ │ ├── primitive-id.frag
│ │ ├── primitive-id.geom
│ │ ├── render-target-array-index.frag
│ │ ├── render-target-array-index.geom
│ │ ├── sample-rate-pos.frag
│ │ ├── stencil-ref.frag
│ │ ├── sv-shading-rate.noglsl.frag
│ │ ├── sv-shading-rate.noglsl.vert
│ │ ├── view-id.frag
│ │ ├── view-id.vert
│ │ ├── viewport-array-index.frag
│ │ └── viewport-array-index.geom
│ ├── stages/
│ │ ├── boolean-io.vert
│ │ ├── callable-chain.rcall
│ │ ├── callable.rcall
│ │ ├── closesthit.rclosest
│ │ ├── domain-clip-cull.tese
│ │ ├── domain-patch-input-integer-io.tese
│ │ ├── domain.tese
│ │ ├── extra_output.dual-source-blending.frag
│ │ ├── extra_output_reordered.dual-source-blending.frag
│ │ ├── geometry-clip-cull.geom
│ │ ├── geometry-input-line.geom
│ │ ├── geometry-input-lineadj.geom
│ │ ├── geometry-input-point.geom
│ │ ├── geometry-input-triangle.geom
│ │ ├── geometry-input-triangleadj.geom
│ │ ├── geometry-instancing.geom
│ │ ├── geometry-output-line.geom
│ │ ├── geometry-output-point.geom
│ │ ├── geometry-streams.geom
│ │ ├── hull-arrays.tesc
│ │ ├── hull-clip-cull.tesc
│ │ ├── hull-patch-output-integer-io.tesc
│ │ ├── hull-single-cp.tesc
│ │ ├── hull.tesc
│ │ ├── mesh-basic-line.mesh
│ │ ├── mesh-basic.mesh
│ │ ├── mesh-clip-cull.mesh
│ │ ├── raygen-complex-storage-class.rgen
│ │ ├── raygen-skip-inactive-resources.rgen
│ │ ├── raygen.rgen
│ │ ├── raymiss-chain.rmiss
│ │ ├── raymiss.rmiss
│ │ ├── simple.dual-source-blending.frag
│ │ ├── simple.invariant.vert
│ │ ├── stage-input-output.16bit-io.frag
│ │ ├── stage-input-output.frag
│ │ ├── stream-out.stream-out.vert
│ │ ├── swizzle.rt-swizzle.frag
│ │ ├── task-basic.task
│ │ ├── vertex-array-input.vert
│ │ ├── vertex-array-output.vert
│ │ └── vertex-input-remapping.vert
│ ├── vectorization/
│ │ ├── copy-byte-address.ssbo.comp
│ │ ├── copy-composite-2.ssbo.comp
│ │ ├── copy-composite.ssbo.comp
│ │ ├── copy-composite.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double2.ssbo.comp
│ │ ├── copy-double2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double3.ssbo.comp
│ │ ├── copy-double3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double4.ssbo.comp
│ │ ├── copy-float2.ssbo.comp
│ │ ├── copy-float2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float2x2.ssbo.comp
│ │ ├── copy-float3.ssbo.comp
│ │ ├── copy-float3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float4x4.ssbo.comp
│ │ ├── copy-half2.ssbo.comp
│ │ ├── copy-half2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half3.ssbo.comp
│ │ ├── copy-half3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half4.ssbo.comp
│ │ └── copy-half4.ssbo.ssbo-align.bindless.comp
│ ├── view-instancing/
│ │ ├── geom/
│ │ │ ├── basic.view-instancing.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.view-instancing-viewport-offset.last-pre-raster.geom
│ │ │ └── basic.view-instancing.view-instancing-viewport-offset.last-pre-raster.geom
│ │ ├── mesh/
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ ├── basic-few-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-many-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ └── basic.view-instancing.mesh
│ │ ├── tesc/
│ │ │ ├── basic.view-instancing.tesc
│ │ │ └── basic.view-instancing.view-instancing-multiview.tesc
│ │ ├── tese/
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.view-instancing-viewport-offset.last-pre-raster.tese
│ │ │ └── domain.view-instancing.view-instancing-viewport-offset.tese
│ │ └── vert/
│ │ ├── basic.view-instancing.export-layer-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer-viewport.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-layer.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-viewport.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.last-pre-raster.vert
│ │ ├── basic.view-instancing.vert
│ │ ├── basic.view-instancing.view-instance-mask.last-pre-raster.vert
│ │ ├── basic.view-instancing.view-instance-mask.vert
│ │ ├── basic.view-instancing.view-instancing-multiview.vert
│ │ └── basic.view-instancing.view-instancing-viewport-offset.vert
│ └── vkmm/
│ ├── coopmat.sm66.ssbo.vkmm.comp
│ ├── cross_group_sharing.vkmm.node.inline-ubo.comp
│ ├── descriptor_qa.bindless.descriptor-qa.vkmm.comp
│ ├── groupshared.vkmm.comp
│ ├── hull.vkmm.tesc
│ ├── image-load-store.vkmm.comp
│ ├── image-load-store.vkmm.sm66.comp
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.ssbo.vkmm.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent.sm66.ssbo.vkmm.comp
│ │ └── uav-coherent.ssbo.vkmm.comp
│ ├── report-hit.vkmm.rint
│ ├── rov-structured.vkmm.frag
│ └── rov-tex2d.vkmm.frag
├── reference-dxbc/
│ ├── test_arithmetic_bool.asm
│ ├── test_arithmetic_bool.glsl
│ ├── test_arithmetic_fp16_compare.asm
│ ├── test_arithmetic_fp16_compare.glsl
│ ├── test_arithmetic_fp16_packing.asm
│ ├── test_arithmetic_fp16_packing.glsl
│ ├── test_arithmetic_fp16_packing_legacy.asm
│ ├── test_arithmetic_fp16_packing_legacy.glsl
│ ├── test_arithmetic_fp16_scalar.asm
│ ├── test_arithmetic_fp16_scalar.glsl
│ ├── test_arithmetic_fp16_vector.asm
│ ├── test_arithmetic_fp16_vector.glsl
│ ├── test_arithmetic_fp32.asm
│ ├── test_arithmetic_fp32.glsl
│ ├── test_arithmetic_fp32_compare.asm
│ ├── test_arithmetic_fp32_compare.glsl
│ ├── test_arithmetic_fp32_precise.asm
│ ├── test_arithmetic_fp32_precise.glsl
│ ├── test_arithmetic_fp32_special.asm
│ ├── test_arithmetic_fp32_special.glsl
│ ├── test_arithmetic_fp64.asm
│ ├── test_arithmetic_fp64.glsl
│ ├── test_arithmetic_fp64_compare.asm
│ ├── test_arithmetic_fp64_compare.glsl
│ ├── test_arithmetic_fp64_packing.asm
│ ├── test_arithmetic_fp64_packing.glsl
│ ├── test_arithmetic_int_extended.asm
│ ├── test_arithmetic_int_extended.glsl
│ ├── test_arithmetic_sint16_compare.asm
│ ├── test_arithmetic_sint16_compare.glsl
│ ├── test_arithmetic_sint16_scalar.asm
│ ├── test_arithmetic_sint16_scalar.glsl
│ ├── test_arithmetic_sint16_vector.asm
│ ├── test_arithmetic_sint16_vector.glsl
│ ├── test_arithmetic_sint32.asm
│ ├── test_arithmetic_sint32.glsl
│ ├── test_arithmetic_sint32_compare.asm
│ ├── test_arithmetic_sint32_compare.glsl
│ ├── test_arithmetic_uint16_compare.asm
│ ├── test_arithmetic_uint16_compare.glsl
│ ├── test_arithmetic_uint16_scalar.asm
│ ├── test_arithmetic_uint16_scalar.glsl
│ ├── test_arithmetic_uint16_vector.asm
│ ├── test_arithmetic_uint16_vector.glsl
│ ├── test_arithmetic_uint32.asm
│ ├── test_arithmetic_uint32.glsl
│ ├── test_arithmetic_uint32_compare.asm
│ ├── test_arithmetic_uint32_compare.glsl
│ ├── test_cfg_if.asm
│ ├── test_cfg_if.glsl
│ ├── test_cfg_if_else.asm
│ ├── test_cfg_if_else.glsl
│ ├── test_cfg_loop_infinite.asm
│ ├── test_cfg_loop_infinite.glsl
│ ├── test_cfg_loop_once.asm
│ ├── test_cfg_loop_once.glsl
│ ├── test_cfg_switch_complex.asm
│ ├── test_cfg_switch_complex.glsl
│ ├── test_cfg_switch_simple.asm
│ ├── test_cfg_switch_simple.glsl
│ ├── test_convert_f_to_f.asm
│ ├── test_convert_f_to_f.glsl
│ ├── test_convert_f_to_i.asm
│ ├── test_convert_f_to_i.glsl
│ ├── test_convert_i_to_f.asm
│ ├── test_convert_i_to_f.glsl
│ ├── test_convert_i_to_i.asm
│ ├── test_convert_i_to_i.glsl
│ ├── test_io_cs_builtins.asm
│ ├── test_io_cs_builtins.glsl
│ ├── test_io_ds_isoline.asm
│ ├── test_io_ds_isoline.glsl
│ ├── test_io_ds_quad.asm
│ ├── test_io_ds_quad.glsl
│ ├── test_io_ds_triangle.asm
│ ├── test_io_ds_triangle.glsl
│ ├── test_io_gs_basic_line.asm
│ ├── test_io_gs_basic_line.glsl
│ ├── test_io_gs_basic_line_adj.asm
│ ├── test_io_gs_basic_line_adj.glsl
│ ├── test_io_gs_basic_point.asm
│ ├── test_io_gs_basic_point.glsl
│ ├── test_io_gs_basic_triangle.asm
│ ├── test_io_gs_basic_triangle.glsl
│ ├── test_io_gs_basic_triangle_adj.asm
│ ├── test_io_gs_basic_triangle_adj.glsl
│ ├── test_io_gs_instanced.asm
│ ├── test_io_gs_instanced.glsl
│ ├── test_io_gs_multi_stream_xfb_raster_0.asm
│ ├── test_io_gs_multi_stream_xfb_raster_0.glsl
│ ├── test_io_gs_multi_stream_xfb_raster_1.asm
│ ├── test_io_gs_multi_stream_xfb_raster_1.glsl
│ ├── test_io_gs_xfb.asm
│ ├── test_io_gs_xfb.glsl
│ ├── test_io_hs_line.asm
│ ├── test_io_hs_line.glsl
│ ├── test_io_hs_point.asm
│ ├── test_io_hs_point.glsl
│ ├── test_io_hs_triangle_ccw.asm
│ ├── test_io_hs_triangle_ccw.glsl
│ ├── test_io_hs_triangle_cw.asm
│ ├── test_io_hs_triangle_cw.glsl
│ ├── test_io_ps_builtins.asm
│ ├── test_io_ps_builtins.glsl
│ ├── test_io_ps_export_depth.asm
│ ├── test_io_ps_export_depth.glsl
│ ├── test_io_ps_export_depth_greater.asm
│ ├── test_io_ps_export_depth_greater.glsl
│ ├── test_io_ps_export_depth_less.asm
│ ├── test_io_ps_export_depth_less.glsl
│ ├── test_io_ps_export_stencil.asm
│ ├── test_io_ps_export_stencil.glsl
│ ├── test_io_ps_fully_covered.asm
│ ├── test_io_ps_fully_covered.glsl
│ ├── test_io_ps_interpolate_centroid.asm
│ ├── test_io_ps_interpolate_centroid.glsl
│ ├── test_io_ps_interpolate_offset.asm
│ ├── test_io_ps_interpolate_offset.glsl
│ ├── test_io_ps_interpolate_sample.asm
│ ├── test_io_ps_interpolate_sample.glsl
│ ├── test_io_vs.asm
│ ├── test_io_vs.glsl
│ ├── test_io_vs_clip_cull_dist.asm
│ ├── test_io_vs_clip_cull_dist.glsl
│ ├── test_io_vs_clip_dist.asm
│ ├── test_io_vs_clip_dist.glsl
│ ├── test_io_vs_cull_dist.asm
│ ├── test_io_vs_cull_dist.glsl
│ ├── test_io_vs_instance_id.asm
│ ├── test_io_vs_instance_id.glsl
│ ├── test_io_vs_layer.asm
│ ├── test_io_vs_layer.glsl
│ ├── test_io_vs_vertex_id.asm
│ ├── test_io_vs_vertex_id.glsl
│ ├── test_io_vs_viewport.asm
│ ├── test_io_vs_viewport.glsl
│ ├── test_misc_constant_load.asm
│ ├── test_misc_constant_load.glsl
│ ├── test_misc_function.asm
│ ├── test_misc_function.glsl
│ ├── test_misc_function_with_args.asm
│ ├── test_misc_function_with_args.glsl
│ ├── test_misc_function_with_return.asm
│ ├── test_misc_function_with_return.glsl
│ ├── test_misc_function_with_undef.asm
│ ├── test_misc_function_with_undef.glsl
│ ├── test_misc_lds.asm
│ ├── test_misc_lds.glsl
│ ├── test_misc_lds_atomic.asm
│ ├── test_misc_lds_atomic.glsl
│ ├── test_misc_ps_demote.asm
│ ├── test_misc_ps_demote.glsl
│ ├── test_misc_ps_early_z.asm
│ ├── test_misc_ps_early_z.glsl
│ ├── test_misc_scratch.asm
│ ├── test_misc_scratch.glsl
│ ├── test_resource_rov.asm
│ ├── test_resource_rov.glsl
│ ├── test_resource_srv_buffer_load_sparse_feedback.asm
│ ├── test_resource_srv_buffer_load_sparse_feedback.glsl
│ ├── test_resource_srv_image_1d_array_load.asm
│ ├── test_resource_srv_image_1d_array_load.glsl
│ ├── test_resource_srv_image_1d_array_query.asm
│ ├── test_resource_srv_image_1d_array_query.glsl
│ ├── test_resource_srv_image_1d_array_sample.asm
│ ├── test_resource_srv_image_1d_array_sample.glsl
│ ├── test_resource_srv_image_1d_load.asm
│ ├── test_resource_srv_image_1d_load.glsl
│ ├── test_resource_srv_image_1d_query.asm
│ ├── test_resource_srv_image_1d_query.glsl
│ ├── test_resource_srv_image_1d_sample.asm
│ ├── test_resource_srv_image_1d_sample.glsl
│ ├── test_resource_srv_image_2d_array_gather.asm
│ ├── test_resource_srv_image_2d_array_gather.glsl
│ ├── test_resource_srv_image_2d_array_gather_depth.asm
│ ├── test_resource_srv_image_2d_array_gather_depth.glsl
│ ├── test_resource_srv_image_2d_array_load.asm
│ ├── test_resource_srv_image_2d_array_load.glsl
│ ├── test_resource_srv_image_2d_array_query.asm
│ ├── test_resource_srv_image_2d_array_query.glsl
│ ├── test_resource_srv_image_2d_array_sample.asm
│ ├── test_resource_srv_image_2d_array_sample.glsl
│ ├── test_resource_srv_image_2d_array_sample_depth.asm
│ ├── test_resource_srv_image_2d_array_sample_depth.glsl
│ ├── test_resource_srv_image_2d_gather.asm
│ ├── test_resource_srv_image_2d_gather.glsl
│ ├── test_resource_srv_image_2d_gather_depth.asm
│ ├── test_resource_srv_image_2d_gather_depth.glsl
│ ├── test_resource_srv_image_2d_load.asm
│ ├── test_resource_srv_image_2d_load.glsl
│ ├── test_resource_srv_image_2d_ms_array_load.asm
│ ├── test_resource_srv_image_2d_ms_array_load.glsl
│ ├── test_resource_srv_image_2d_ms_array_query.asm
│ ├── test_resource_srv_image_2d_ms_array_query.glsl
│ ├── test_resource_srv_image_2d_ms_load.asm
│ ├── test_resource_srv_image_2d_ms_load.glsl
│ ├── test_resource_srv_image_2d_ms_query.asm
│ ├── test_resource_srv_image_2d_ms_query.glsl
│ ├── test_resource_srv_image_2d_query.asm
│ ├── test_resource_srv_image_2d_query.glsl
│ ├── test_resource_srv_image_2d_sample.asm
│ ├── test_resource_srv_image_2d_sample.glsl
│ ├── test_resource_srv_image_2d_sample_depth.asm
│ ├── test_resource_srv_image_2d_sample_depth.glsl
│ ├── test_resource_srv_image_3d_load.asm
│ ├── test_resource_srv_image_3d_load.glsl
│ ├── test_resource_srv_image_3d_query.asm
│ ├── test_resource_srv_image_3d_query.glsl
│ ├── test_resource_srv_image_3d_sample.asm
│ ├── test_resource_srv_image_3d_sample.glsl
│ ├── test_resource_srv_image_cube_array_gather.asm
│ ├── test_resource_srv_image_cube_array_gather.glsl
│ ├── test_resource_srv_image_cube_array_gather_depth.asm
│ ├── test_resource_srv_image_cube_array_gather_depth.glsl
│ ├── test_resource_srv_image_cube_array_query.asm
│ ├── test_resource_srv_image_cube_array_query.glsl
│ ├── test_resource_srv_image_cube_array_sample.asm
│ ├── test_resource_srv_image_cube_array_sample.glsl
│ ├── test_resource_srv_image_cube_array_sample_depth.asm
│ ├── test_resource_srv_image_cube_array_sample_depth.glsl
│ ├── test_resource_srv_image_cube_gather.asm
│ ├── test_resource_srv_image_cube_gather.glsl
│ ├── test_resource_srv_image_cube_gather_depth.asm
│ ├── test_resource_srv_image_cube_gather_depth.glsl
│ ├── test_resource_srv_image_cube_query.asm
│ ├── test_resource_srv_image_cube_query.glsl
│ ├── test_resource_srv_image_cube_sample.asm
│ ├── test_resource_srv_image_cube_sample.glsl
│ ├── test_resource_srv_image_cube_sample_depth.asm
│ ├── test_resource_srv_image_cube_sample_depth.glsl
│ ├── test_resource_srv_image_gather_depth_sparse_feedback.asm
│ ├── test_resource_srv_image_gather_depth_sparse_feedback.glsl
│ ├── test_resource_srv_image_gather_sparse_feedback.asm
│ ├── test_resource_srv_image_gather_sparse_feedback.glsl
│ ├── test_resource_srv_image_load_sparse_feedback.asm
│ ├── test_resource_srv_image_load_sparse_feedback.glsl
│ ├── test_resource_srv_image_sample_depth_sparse_feedback.asm
│ ├── test_resource_srv_image_sample_depth_sparse_feedback.glsl
│ ├── test_resource_srv_image_sample_sparse_feedback.asm
│ ├── test_resource_srv_image_sample_sparse_feedback.glsl
│ ├── test_resource_srv_indexed_image_1d_array_load.asm
│ ├── test_resource_srv_indexed_image_1d_array_load.glsl
│ ├── test_resource_srv_indexed_image_1d_array_query.asm
│ ├── test_resource_srv_indexed_image_1d_array_query.glsl
│ ├── test_resource_srv_indexed_image_1d_array_sample.asm
│ ├── test_resource_srv_indexed_image_1d_array_sample.glsl
│ ├── test_resource_srv_indexed_image_1d_load.asm
│ ├── test_resource_srv_indexed_image_1d_load.glsl
│ ├── test_resource_srv_indexed_image_1d_query.asm
│ ├── test_resource_srv_indexed_image_1d_query.glsl
│ ├── test_resource_srv_indexed_image_1d_sample.asm
│ ├── test_resource_srv_indexed_image_1d_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_array_gather.asm
│ ├── test_resource_srv_indexed_image_2d_array_gather.glsl
│ ├── test_resource_srv_indexed_image_2d_array_gather_depth.asm
│ ├── test_resource_srv_indexed_image_2d_array_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_array_load.asm
│ ├── test_resource_srv_indexed_image_2d_array_load.glsl
│ ├── test_resource_srv_indexed_image_2d_array_query.asm
│ ├── test_resource_srv_indexed_image_2d_array_query.glsl
│ ├── test_resource_srv_indexed_image_2d_array_sample.asm
│ ├── test_resource_srv_indexed_image_2d_array_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_array_sample_depth.asm
│ ├── test_resource_srv_indexed_image_2d_array_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_gather.asm
│ ├── test_resource_srv_indexed_image_2d_gather.glsl
│ ├── test_resource_srv_indexed_image_2d_gather_depth.asm
│ ├── test_resource_srv_indexed_image_2d_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_load.asm
│ ├── test_resource_srv_indexed_image_2d_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_array_load.asm
│ ├── test_resource_srv_indexed_image_2d_ms_array_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_array_query.asm
│ ├── test_resource_srv_indexed_image_2d_ms_array_query.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_load.asm
│ ├── test_resource_srv_indexed_image_2d_ms_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_query.asm
│ ├── test_resource_srv_indexed_image_2d_ms_query.glsl
│ ├── test_resource_srv_indexed_image_2d_query.asm
│ ├── test_resource_srv_indexed_image_2d_query.glsl
│ ├── test_resource_srv_indexed_image_2d_sample.asm
│ ├── test_resource_srv_indexed_image_2d_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_sample_depth.asm
│ ├── test_resource_srv_indexed_image_2d_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_3d_load.asm
│ ├── test_resource_srv_indexed_image_3d_load.glsl
│ ├── test_resource_srv_indexed_image_3d_query.asm
│ ├── test_resource_srv_indexed_image_3d_query.glsl
│ ├── test_resource_srv_indexed_image_3d_sample.asm
│ ├── test_resource_srv_indexed_image_3d_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_array_gather.asm
│ ├── test_resource_srv_indexed_image_cube_array_gather.glsl
│ ├── test_resource_srv_indexed_image_cube_array_gather_depth.asm
│ ├── test_resource_srv_indexed_image_cube_array_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_array_query.asm
│ ├── test_resource_srv_indexed_image_cube_array_query.glsl
│ ├── test_resource_srv_indexed_image_cube_array_sample.asm
│ ├── test_resource_srv_indexed_image_cube_array_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_array_sample_depth.asm
│ ├── test_resource_srv_indexed_image_cube_array_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_gather.asm
│ ├── test_resource_srv_indexed_image_cube_gather.glsl
│ ├── test_resource_srv_indexed_image_cube_gather_depth.asm
│ ├── test_resource_srv_indexed_image_cube_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_query.asm
│ ├── test_resource_srv_indexed_image_cube_query.glsl
│ ├── test_resource_srv_indexed_image_cube_sample.asm
│ ├── test_resource_srv_indexed_image_cube_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_sample_depth.asm
│ ├── test_resource_srv_indexed_image_cube_sample_depth.glsl
│ ├── test_resource_uav_buffer_load_sparse_feedback.asm
│ ├── test_resource_uav_buffer_load_sparse_feedback.glsl
│ ├── test_resource_uav_counter.asm
│ ├── test_resource_uav_counter.glsl
│ ├── test_resource_uav_counter_indexed.asm
│ ├── test_resource_uav_counter_indexed.glsl
│ ├── test_resource_uav_image_1d_array_atomic.asm
│ ├── test_resource_uav_image_1d_array_atomic.glsl
│ ├── test_resource_uav_image_1d_array_load.asm
│ ├── test_resource_uav_image_1d_array_load.glsl
│ ├── test_resource_uav_image_1d_array_query.asm
│ ├── test_resource_uav_image_1d_array_query.glsl
│ ├── test_resource_uav_image_1d_array_store.asm
│ ├── test_resource_uav_image_1d_array_store.glsl
│ ├── test_resource_uav_image_1d_atomic.asm
│ ├── test_resource_uav_image_1d_atomic.glsl
│ ├── test_resource_uav_image_1d_load.asm
│ ├── test_resource_uav_image_1d_load.glsl
│ ├── test_resource_uav_image_1d_query.asm
│ ├── test_resource_uav_image_1d_query.glsl
│ ├── test_resource_uav_image_1d_store.asm
│ ├── test_resource_uav_image_1d_store.glsl
│ ├── test_resource_uav_image_2d_array_atomic.asm
│ ├── test_resource_uav_image_2d_array_atomic.glsl
│ ├── test_resource_uav_image_2d_array_load.asm
│ ├── test_resource_uav_image_2d_array_load.glsl
│ ├── test_resource_uav_image_2d_array_query.asm
│ ├── test_resource_uav_image_2d_array_query.glsl
│ ├── test_resource_uav_image_2d_array_store.asm
│ ├── test_resource_uav_image_2d_array_store.glsl
│ ├── test_resource_uav_image_2d_atomic.asm
│ ├── test_resource_uav_image_2d_atomic.glsl
│ ├── test_resource_uav_image_2d_load.asm
│ ├── test_resource_uav_image_2d_load.glsl
│ ├── test_resource_uav_image_2d_load_precise.asm
│ ├── test_resource_uav_image_2d_load_precise.glsl
│ ├── test_resource_uav_image_2d_query.asm
│ ├── test_resource_uav_image_2d_query.glsl
│ ├── test_resource_uav_image_2d_store.asm
│ ├── test_resource_uav_image_2d_store.glsl
│ ├── test_resource_uav_image_3d_atomic.asm
│ ├── test_resource_uav_image_3d_atomic.glsl
│ ├── test_resource_uav_image_3d_load.asm
│ ├── test_resource_uav_image_3d_load.glsl
│ ├── test_resource_uav_image_3d_query.asm
│ ├── test_resource_uav_image_3d_query.glsl
│ ├── test_resource_uav_image_3d_store.asm
│ ├── test_resource_uav_image_3d_store.glsl
│ ├── test_resource_uav_image_load_sparse_feedback.asm
│ ├── test_resource_uav_image_load_sparse_feedback.glsl
│ ├── test_resource_uav_indexed_image_1d_array_atomic.asm
│ ├── test_resource_uav_indexed_image_1d_array_atomic.glsl
│ ├── test_resource_uav_indexed_image_1d_array_load.asm
│ ├── test_resource_uav_indexed_image_1d_array_load.glsl
│ ├── test_resource_uav_indexed_image_1d_array_query.asm
│ ├── test_resource_uav_indexed_image_1d_array_query.glsl
│ ├── test_resource_uav_indexed_image_1d_array_store.asm
│ ├── test_resource_uav_indexed_image_1d_array_store.glsl
│ ├── test_resource_uav_indexed_image_1d_atomic.asm
│ ├── test_resource_uav_indexed_image_1d_atomic.glsl
│ ├── test_resource_uav_indexed_image_1d_load.asm
│ ├── test_resource_uav_indexed_image_1d_load.glsl
│ ├── test_resource_uav_indexed_image_1d_query.asm
│ ├── test_resource_uav_indexed_image_1d_query.glsl
│ ├── test_resource_uav_indexed_image_1d_store.asm
│ ├── test_resource_uav_indexed_image_1d_store.glsl
│ ├── test_resource_uav_indexed_image_2d_array_atomic.asm
│ ├── test_resource_uav_indexed_image_2d_array_atomic.glsl
│ ├── test_resource_uav_indexed_image_2d_array_load.asm
│ ├── test_resource_uav_indexed_image_2d_array_load.glsl
│ ├── test_resource_uav_indexed_image_2d_array_query.asm
│ ├── test_resource_uav_indexed_image_2d_array_query.glsl
│ ├── test_resource_uav_indexed_image_2d_array_store.asm
│ ├── test_resource_uav_indexed_image_2d_array_store.glsl
│ ├── test_resource_uav_indexed_image_2d_atomic.asm
│ ├── test_resource_uav_indexed_image_2d_atomic.glsl
│ ├── test_resource_uav_indexed_image_2d_load.asm
│ ├── test_resource_uav_indexed_image_2d_load.glsl
│ ├── test_resource_uav_indexed_image_2d_query.asm
│ ├── test_resource_uav_indexed_image_2d_query.glsl
│ ├── test_resource_uav_indexed_image_2d_store.asm
│ ├── test_resource_uav_indexed_image_2d_store.glsl
│ ├── test_resource_uav_indexed_image_3d_atomic.asm
│ ├── test_resource_uav_indexed_image_3d_atomic.glsl
│ ├── test_resource_uav_indexed_image_3d_load.asm
│ ├── test_resource_uav_indexed_image_3d_load.glsl
│ ├── test_resource_uav_indexed_image_3d_query.asm
│ ├── test_resource_uav_indexed_image_3d_query.glsl
│ ├── test_resource_uav_indexed_image_3d_store.asm
│ ├── test_resource_uav_indexed_image_3d_store.glsl
│ ├── test_resources_cbv.asm
│ ├── test_resources_cbv.glsl
│ ├── test_resources_cbv_dynamic.asm
│ ├── test_resources_cbv_dynamic.glsl
│ ├── test_resources_cbv_indexed.asm
│ ├── test_resources_cbv_indexed.glsl
│ ├── test_resources_cbv_indexed_nonuniform.asm
│ ├── test_resources_cbv_indexed_nonuniform.glsl
│ ├── test_resources_srv_buffer_raw_load.asm
│ ├── test_resources_srv_buffer_raw_load.glsl
│ ├── test_resources_srv_buffer_raw_query.asm
│ ├── test_resources_srv_buffer_raw_query.glsl
│ ├── test_resources_srv_buffer_structured_load.asm
│ ├── test_resources_srv_buffer_structured_load.glsl
│ ├── test_resources_srv_buffer_structured_query.asm
│ ├── test_resources_srv_buffer_structured_query.glsl
│ ├── test_resources_srv_buffer_typed_load.asm
│ ├── test_resources_srv_buffer_typed_load.glsl
│ ├── test_resources_srv_buffer_typed_query.asm
│ ├── test_resources_srv_buffer_typed_query.glsl
│ ├── test_resources_srv_indexed_buffer_raw_load.asm
│ ├── test_resources_srv_indexed_buffer_raw_load.glsl
│ ├── test_resources_srv_indexed_buffer_raw_query.asm
│ ├── test_resources_srv_indexed_buffer_raw_query.glsl
│ ├── test_resources_srv_indexed_buffer_structured_load.asm
│ ├── test_resources_srv_indexed_buffer_structured_load.glsl
│ ├── test_resources_srv_indexed_buffer_structured_query.asm
│ ├── test_resources_srv_indexed_buffer_structured_query.glsl
│ ├── test_resources_srv_indexed_buffer_typed_load.asm
│ ├── test_resources_srv_indexed_buffer_typed_load.glsl
│ ├── test_resources_srv_indexed_buffer_typed_query.asm
│ ├── test_resources_srv_indexed_buffer_typed_query.glsl
│ ├── test_resources_uav_buffer_raw_atomic.asm
│ ├── test_resources_uav_buffer_raw_atomic.glsl
│ ├── test_resources_uav_buffer_raw_load.asm
│ ├── test_resources_uav_buffer_raw_load.glsl
│ ├── test_resources_uav_buffer_raw_load_precise.asm
│ ├── test_resources_uav_buffer_raw_load_precise.glsl
│ ├── test_resources_uav_buffer_raw_query.asm
│ ├── test_resources_uav_buffer_raw_query.glsl
│ ├── test_resources_uav_buffer_raw_store.asm
│ ├── test_resources_uav_buffer_raw_store.glsl
│ ├── test_resources_uav_buffer_structured_atomic.asm
│ ├── test_resources_uav_buffer_structured_atomic.glsl
│ ├── test_resources_uav_buffer_structured_load.asm
│ ├── test_resources_uav_buffer_structured_load.glsl
│ ├── test_resources_uav_buffer_structured_load_precise.asm
│ ├── test_resources_uav_buffer_structured_load_precise.glsl
│ ├── test_resources_uav_buffer_structured_query.asm
│ ├── test_resources_uav_buffer_structured_query.glsl
│ ├── test_resources_uav_buffer_structured_store.asm
│ ├── test_resources_uav_buffer_structured_store.glsl
│ ├── test_resources_uav_buffer_typed_atomic.asm
│ ├── test_resources_uav_buffer_typed_atomic.glsl
│ ├── test_resources_uav_buffer_typed_load.asm
│ ├── test_resources_uav_buffer_typed_load.glsl
│ ├── test_resources_uav_buffer_typed_load_precise.asm
│ ├── test_resources_uav_buffer_typed_load_precise.glsl
│ ├── test_resources_uav_buffer_typed_query.asm
│ ├── test_resources_uav_buffer_typed_query.glsl
│ ├── test_resources_uav_buffer_typed_store.asm
│ ├── test_resources_uav_buffer_typed_store.glsl
│ ├── test_resources_uav_indexed_buffer_raw_atomic.asm
│ ├── test_resources_uav_indexed_buffer_raw_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_raw_load.asm
│ ├── test_resources_uav_indexed_buffer_raw_load.glsl
│ ├── test_resources_uav_indexed_buffer_raw_query.asm
│ ├── test_resources_uav_indexed_buffer_raw_query.glsl
│ ├── test_resources_uav_indexed_buffer_raw_store.asm
│ ├── test_resources_uav_indexed_buffer_raw_store.glsl
│ ├── test_resources_uav_indexed_buffer_structured_atomic.asm
│ ├── test_resources_uav_indexed_buffer_structured_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_structured_load.asm
│ ├── test_resources_uav_indexed_buffer_structured_load.glsl
│ ├── test_resources_uav_indexed_buffer_structured_query.asm
│ ├── test_resources_uav_indexed_buffer_structured_query.glsl
│ ├── test_resources_uav_indexed_buffer_structured_store.asm
│ ├── test_resources_uav_indexed_buffer_structured_store.glsl
│ ├── test_resources_uav_indexed_buffer_typed_atomic.asm
│ ├── test_resources_uav_indexed_buffer_typed_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_typed_load.asm
│ ├── test_resources_uav_indexed_buffer_typed_load.glsl
│ ├── test_resources_uav_indexed_buffer_typed_query.asm
│ ├── test_resources_uav_indexed_buffer_typed_query.glsl
│ ├── test_resources_uav_indexed_buffer_typed_store.asm
│ └── test_resources_uav_indexed_buffer_typed_store.glsl
├── roundtrip_shaders.py
├── scratch_pool.hpp
├── shaders/
│ ├── ags/
│ │ ├── ags.ssbo.comp
│ │ ├── ags_shader_intrinsics_dx12.inc
│ │ ├── cs_constexpr_wmma_gep.sm66.full-wmma.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.ssbo.comp
│ │ ├── cs_wmma_alloca.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_extract_insert.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_at.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_bt.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ct.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ot.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f32.sm66.ssbo.comp
│ │ ├── cs_wmma_fp16_fp8_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp16_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp8_conversions.sm66.ssbo.nv-coopmat2.comp
│ │ ├── cs_wmma_fp8_fp32_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_lds_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_matrix_length.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.full-wmma.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.sm66.ssbo.comp
│ │ └── wmma_ags.h
│ ├── alloca-opts/
│ │ ├── bad-stride.frag
│ │ ├── double-array-load.frag
│ │ ├── float4-array-load.bindless.frag
│ │ ├── float4-array-load.bindless.root-constants.frag
│ │ ├── float4-array-load.frag
│ │ ├── float4-array-load.root-constant.frag
│ │ ├── float4-array-load.root-descriptor.frag
│ │ ├── float4-array-load.root-descriptor.root-constants.frag
│ │ ├── load-different.frag
│ │ ├── local-root-constants.local-root-signature.rgen
│ │ ├── matrix-load.frag
│ │ ├── missing-first.frag
│ │ ├── missing-last-element.frag
│ │ ├── out-of-order-load.frag
│ │ ├── store-after-load.frag
│ │ └── uint4-array-load.frag
│ ├── asm/
│ │ ├── bfi.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps-single-alias.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps.bc.dxil
│ │ ├── constant-struct-aggregate.bc.dxil
│ │ ├── control-flow-multi-break-with-non-idom-loop-header.dxil
│ │ ├── ibfe.bc.dxil
│ │ └── ubfe.bc.dxil
│ ├── auto-barrier/
│ │ ├── complex-loop.auto-group-shared-barrier.comp
│ │ ├── inner-to-inner.auto-group-shared-barrier.comp
│ │ ├── inner-to-outer.auto-group-shared-barrier.comp
│ │ ├── outer-to-inner.auto-group-shared-barrier.comp
│ │ ├── single-block-loop.auto-group-shared-barrier.comp
│ │ └── single-block.auto-group-shared-barrier.comp
│ ├── control-flow/
│ │ ├── branch-return-2.comp
│ │ ├── branch-return.comp
│ │ ├── branch.comp
│ │ ├── conditional-break-into-if-else-if-ladder-2.comp
│ │ ├── conditional-break-into-if-else-if-ladder.comp
│ │ ├── dual-inner-loop-early-return.comp
│ │ ├── if-else-if-into-continue.comp
│ │ ├── inner-loop-early-return.comp
│ │ ├── interleaved-unrolled-loop-breaks.comp
│ │ ├── loop-break-2.comp
│ │ ├── loop-break.comp
│ │ ├── loop-continue-2.comp
│ │ ├── loop-continue-3.comp
│ │ ├── loop-continue.comp
│ │ ├── loop-inside-infinite-loop-2.frag
│ │ ├── loop-inside-infinite-loop.frag
│ │ ├── loop-return.comp
│ │ ├── loop.comp
│ │ ├── nested-loop-break-2.comp
│ │ ├── nested-loop-break.comp
│ │ ├── nested-loop.comp
│ │ ├── selection-merge-split-post-domination.frag
│ │ ├── switch-continue.frag
│ │ ├── switch-merge-into-other-merge.comp
│ │ ├── switch-shared-header-with-loop.comp
│ │ └── wave-size-dependent-loop-unroll.comp
│ ├── descriptor_qa/
│ │ ├── acceleration-structure.bindless.descriptor-qa.rgen
│ │ ├── acceleration-structure.bindless.descriptor-qa.sm66.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.descriptor-qa.rgen
│ │ ├── descriptor_qa.bindless.cbv-as-ssbo.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.sm66.comp
│ │ ├── descriptor_qa.bindless.ssbo.descriptor-qa.comp
│ │ ├── early-2.bindless.descriptor-qa.frag
│ │ ├── early-3.bindless.descriptor-qa.frag
│ │ ├── early-4.bindless.descriptor-qa.frag
│ │ ├── early-5.bindless.descriptor-qa.frag
│ │ ├── early-heap.descriptor-qa.sm66.frag
│ │ └── early.bindless.descriptor-qa.frag
│ ├── dxil-builtin/
│ │ ├── accept-hit-and-end-search-ignore-hit.rany
│ │ ├── acos.frag
│ │ ├── asin.frag
│ │ ├── atan.frag
│ │ ├── atomic-bin-op.bindless.root-constant.frag
│ │ ├── atomic-bin-op.frag
│ │ ├── atomic-bin-op.root-descriptor.comp
│ │ ├── atomic-bin-op.ssbo.frag
│ │ ├── atomic-compare-exchange.frag
│ │ ├── atomic-compare-exchange.root-descriptor.comp
│ │ ├── atomic-compare-exchange.ssbo.frag
│ │ ├── attributes.denorm-ftz.comp
│ │ ├── attributes.denorm-preserve.comp
│ │ ├── barrier.comp
│ │ ├── barycentrics-2.frag
│ │ ├── barycentrics.frag
│ │ ├── bfrev.frag
│ │ ├── bitcount-bitrev-sizes.ssbo.comp
│ │ ├── buffer-load-feedback.frag
│ │ ├── buffer-load-signed-feedback.frag
│ │ ├── buffer-load-signed.frag
│ │ ├── buffer-load.frag
│ │ ├── buffer-load.ssbo.frag
│ │ ├── buffer-store-signed.frag
│ │ ├── buffer-store.frag
│ │ ├── buffer-store.ssbo.frag
│ │ ├── buffer-update-counter.frag
│ │ ├── calculate-lod.frag
│ │ ├── call-shader.rgen
│ │ ├── clip.demote-to-helper.frag
│ │ ├── clip.frag
│ │ ├── compute-shader-derivatives-cube-array.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-cube.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-single-thread.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives.noderivs.sm66.ssbo.comp
│ │ ├── cos.frag
│ │ ├── countbits.frag
│ │ ├── coverage.frag
│ │ ├── derivative.frag
│ │ ├── derivative.sm60.frag
│ │ ├── derivative.sm60.native-fp16.frag
│ │ ├── derivatives.sm66.comp
│ │ ├── discard.demote-to-helper.frag
│ │ ├── discard.frag
│ │ ├── dispatch-rays-dimensions.rgen
│ │ ├── dispatch-rays-index.rgen
│ │ ├── dot2.frag
│ │ ├── dot3.frag
│ │ ├── dot4.frag
│ │ ├── eval-centroid.frag
│ │ ├── eval-sample-index.frag
│ │ ├── eval-snapped.frag
│ │ ├── exp.frag
│ │ ├── f16-to-f32.frag
│ │ ├── f32-to-f16.frag
│ │ ├── fabs.frag
│ │ ├── firstbithi-16.sm62.frag
│ │ ├── firstbithi-64.frag
│ │ ├── firstbithi.frag
│ │ ├── firstbitlo-16.sm62.frag
│ │ ├── firstbitlo-64.frag
│ │ ├── firstbitlo.frag
│ │ ├── firstbitshi-16.sm62.frag
│ │ ├── firstbitshi-64.frag
│ │ ├── firstbitshi.frag
│ │ ├── flattened_thread_id_in_group.comp
│ │ ├── fma.frag
│ │ ├── fmad-precise.frag
│ │ ├── fmad.frag
│ │ ├── fmax.frag
│ │ ├── fmin.frag
│ │ ├── frc.frag
│ │ ├── get-dimensions-w-only.frag
│ │ ├── get-dimensions-xyz-only.frag
│ │ ├── get-dimensions.bindless.root-constant.frag
│ │ ├── get-dimensions.bindless.root-constant.ssbo.frag
│ │ ├── get-dimensions.frag
│ │ ├── get-dimensions.ssbo.frag
│ │ ├── group_id.comp
│ │ ├── hcos.frag
│ │ ├── hsin.frag
│ │ ├── htan.frag
│ │ ├── imad.frag
│ │ ├── imax.frag
│ │ ├── imin.frag
│ │ ├── instance-id.vert
│ │ ├── is-helper-lane-2.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane-2.sm66.frag
│ │ ├── is-helper-lane.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane.sm66.frag
│ │ ├── isfinite.frag
│ │ ├── isinf.frag
│ │ ├── isnan.frag
│ │ ├── log.frag
│ │ ├── make-double.frag
│ │ ├── msaa-uav.sm67.comp
│ │ ├── msad.comp
│ │ ├── object-ray-direction.rany
│ │ ├── object-ray-origin.rany
│ │ ├── object-to-world-3x4.rany
│ │ ├── object-to-world-4x3.rany
│ │ ├── pack-unpack.ssbo.sm66.comp
│ │ ├── quad-all-any.sm67.comp
│ │ ├── quad-all-any.sm67.quad-maximal-reconvergence.noglsl.comp
│ │ ├── quad-read-at-2d.comp
│ │ ├── quad-read-at-2d.sm66.comp
│ │ ├── quad-read-at.comp
│ │ ├── quad-read-at.frag
│ │ ├── quad-swap.comp
│ │ ├── quad-swap.frag
│ │ ├── raw-gather-offset-sparse.sm67.ssbo.comp
│ │ ├── raw-gather-offset.sm67.ssbo.comp
│ │ ├── raw-gather-sparse.sm67.ssbo.comp
│ │ ├── raw-gather.sm67.ssbo.comp
│ │ ├── ray-query-phi-multi.invalid.sm66.comp
│ │ ├── ray-query-phi-simple.sm66.comp
│ │ ├── ray-query-select-multi.invalid.sm66.comp
│ │ ├── ray-query-select-simple.sm66.comp
│ │ ├── ray-query-store-multi.invalid.sm66.comp
│ │ ├── ray-query-store-simple.sm66.comp
│ │ ├── ray-query.comp
│ │ ├── ray-t-current.rany
│ │ ├── ray-t-min.rany
│ │ ├── render-target-sample-count.frag
│ │ ├── render-target-sample-position.frag
│ │ ├── report-hit.rint
│ │ ├── round-ne.frag
│ │ ├── round-ni.frag
│ │ ├── round-pi.frag
│ │ ├── round-z.frag
│ │ ├── rsqrt.frag
│ │ ├── rt-geometry-index.rany
│ │ ├── rt-hit-kind.rany
│ │ ├── rt-instance-id.rany
│ │ ├── rt-instance-index.rany
│ │ ├── rt-primitive-index.rany
│ │ ├── rt-ray-flags.rany
│ │ ├── sample-bias-feedback.frag
│ │ ├── sample-bias-offset.frag
│ │ ├── sample-bias.frag
│ │ ├── sample-cmp-bias-feedback.frag
│ │ ├── sample-cmp-bias-offset.frag
│ │ ├── sample-cmp-bias.frag
│ │ ├── sample-cmp-feedback.frag
│ │ ├── sample-cmp-grad-offset-feedback.frag
│ │ ├── sample-cmp-grad-offset.frag
│ │ ├── sample-cmp-grad.frag
│ │ ├── sample-cmp-level.sm67.noglsl.frag
│ │ ├── sample-cmp-levelzero.frag
│ │ ├── sample-cmp-offset-levelzero-feedback.frag
│ │ ├── sample-cmp-offset-levelzero.frag
│ │ ├── sample-cmp-offset.frag
│ │ ├── sample-cmp.frag
│ │ ├── sample-grad-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-grad-offset-feedback.frag
│ │ ├── sample-grad-offset.frag
│ │ ├── sample-grad.frag
│ │ ├── sample-id.frag
│ │ ├── sample-level-offset-feedback.frag
│ │ ├── sample-level-offset.frag
│ │ ├── sample-level.frag
│ │ ├── sample-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-offset.frag
│ │ ├── sample.frag
│ │ ├── saturate.frag
│ │ ├── sin.frag
│ │ ├── sm64-packed-arithmetic.ssbo.comp
│ │ ├── sm64-packed-arithmetic.ssbo.i8dot.noglsl.comp
│ │ ├── sm64-packed-arithmetic.ssbo.mixed-float-dot-product.noglsl.comp
│ │ ├── split-double.frag
│ │ ├── sqrt.frag
│ │ ├── tan.frag
│ │ ├── texture-gather-4offset.frag
│ │ ├── texture-gather-cmp-offset-feedback.frag
│ │ ├── texture-gather-cmp-offset.frag
│ │ ├── texture-gather-cmp.frag
│ │ ├── texture-gather-offset.frag
│ │ ├── texture-gather-signed-feedback.frag
│ │ ├── texture-gather-signed.frag
│ │ ├── texture-gather.frag
│ │ ├── texture-load-feedback.frag
│ │ ├── texture-load-offset-dynamic.sm67.frag
│ │ ├── texture-load-offset.frag
│ │ ├── texture-load-signed.frag
│ │ ├── texture-load.frag
│ │ ├── texture-store-signed.frag
│ │ ├── texture-store.frag
│ │ ├── texture2dms-sample-position.frag
│ │ ├── thread_id.comp
│ │ ├── thread_id_in_group.comp
│ │ ├── trace-ray-flags-2.rgen
│ │ ├── trace-ray-flags.rgen
│ │ ├── trace-ray.rgen
│ │ ├── umad.frag
│ │ ├── umax.frag
│ │ ├── umin.frag
│ │ ├── vertex-id.vert
│ │ ├── wave-active-all-true.comp
│ │ ├── wave-active-all-true.frag
│ │ ├── wave-active-any-true.comp
│ │ ├── wave-active-any-true.frag
│ │ ├── wave-active-ballot-discard.demote-to-helper.frag
│ │ ├── wave-active-ballot-discard.frag
│ │ ├── wave-active-ballot.comp
│ │ ├── wave-active-ballot.demote-to-helper.frag
│ │ ├── wave-active-ballot.frag
│ │ ├── wave-active-count-bits.comp
│ │ ├── wave-active-count-bits.frag
│ │ ├── wave-all-equal.comp
│ │ ├── wave-all-equal.frag
│ │ ├── wave-get-lane-count.comp
│ │ ├── wave-get-lane-index.comp
│ │ ├── wave-is-first-lane.comp
│ │ ├── wave-is-first-lane.frag
│ │ ├── wave-match.comp
│ │ ├── wave-match.frag
│ │ ├── wave-match.partitioned.noglsl.comp
│ │ ├── wave-match.partitioned.noglsl.frag
│ │ ├── wave-multi-prefix-count-bits.comp
│ │ ├── wave-multi-prefix-count-bits.frag
│ │ ├── wave-multi-prefix-op.comp
│ │ ├── wave-multi-prefix-op.frag
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.comp
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.frag
│ │ ├── wave-prefix.comp
│ │ ├── wave-prefix.frag
│ │ ├── wave-read-lane-at-optimizations.comp
│ │ ├── wave-read-lane-at.comp
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.frag
│ │ ├── wave-reduce-helpers.sm67.frag
│ │ ├── wave-reduce-helpers.sm67.quad-maximal-reconvergence.frag
│ │ ├── wave-reduce.comp
│ │ ├── wave-reduce.frag
│ │ ├── wave-size.sm66.comp
│ │ ├── world-ray-direction.rany
│ │ ├── world-ray-origin.rany
│ │ ├── world-to-object-3x4.rany
│ │ └── world-to-object-4x3.rany
│ ├── fp16/
│ │ ├── saturate.frag
│ │ ├── saturate.sm60.frag
│ │ └── saturate.sm60.native-fp16.frag
│ ├── heap-robustness/
│ │ ├── misc.bindless.heap-raw-va-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.heap-robustness-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.sm66.ssbo.comp
│ │ ├── misc.bindless.sm66.ssbo.comp
│ │ └── misc.heap-robustness.bindless.heap-robustness-cbv.heap-raw-va-cbv.sm66.ssbo.comp
│ ├── instrumentation/
│ │ ├── atomics-raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured-counter.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-typed.bindless.bda-instrumentation.ssbo.comp
│ │ ├── cbv.bindless.bda-instrumentation.comp
│ │ ├── cbv.root-descriptor.bda-instrumentation.comp
│ │ ├── raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── structured.bindless.bda-instrumentation.comp
│ │ ├── structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ └── typed.bindless.bda-instrumentation.comp
│ ├── llvm-builtin/
│ │ ├── alloca-robustness-cases.extended-robustness.vert
│ │ ├── alloca.frag
│ │ ├── atomic-bin-op.comp
│ │ ├── atomic-compare-exchange.comp
│ │ ├── atomic-compare-exchange.sm66.ssbo.comp
│ │ ├── bool-to-fp.frag
│ │ ├── constant-expression-cast.comp
│ │ ├── constant-expression-gep.comp
│ │ ├── fadd.frag
│ │ ├── fast-mul-div-pair.comp
│ │ ├── fcmp_eq.frag
│ │ ├── fcmp_ge.frag
│ │ ├── fcmp_gt.frag
│ │ ├── fcmp_le.frag
│ │ ├── fcmp_lt.frag
│ │ ├── fcmp_ne.frag
│ │ ├── fdiv.frag
│ │ ├── fmul.frag
│ │ ├── frem.frag
│ │ ├── fsub.frag
│ │ ├── glitched-integer-width.comp
│ │ ├── groupshared.comp
│ │ ├── icmp_eq.frag
│ │ ├── icmp_ne.frag
│ │ ├── icmp_sge.frag
│ │ ├── icmp_sgt.frag
│ │ ├── icmp_sle.frag
│ │ ├── icmp_slt.frag
│ │ ├── icmp_uge.frag
│ │ ├── icmp_ugt.frag
│ │ ├── icmp_ule.frag
│ │ ├── icmp_ult.frag
│ │ ├── logical-and.frag
│ │ ├── logical-equal.frag
│ │ ├── logical-not-equal.frag
│ │ ├── logical-or.frag
│ │ ├── lut.frag
│ │ ├── min16-phi.sm60.comp
│ │ ├── precise_math.frag
│ │ └── zext-bool.frag
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.comp
│ │ ├── uav-coherent-promotion.ssbo.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.comp
│ │ ├── uav-coherent.sm66.ssbo.comp
│ │ └── uav-coherent.ssbo.comp
│ ├── nvapi/
│ │ ├── bringup.nvapi.ssbo.rgen
│ │ ├── get-special-global-timer.nvapi.ssbo.rgen
│ │ ├── hit-object.local-root-signature.noglsl.nvapi.ssbo.rgen
│ │ ├── nvHLSLExtns.h
│ │ ├── nvHLSLExtnsInternal.h
│ │ ├── nvShaderExtnEnums.h
│ │ ├── ray-query-cluster-id.nvapi.comp
│ │ ├── rt-cluster-id.nvapi.rany
│ │ └── shuffle.nvapi.ssbo.comp
│ ├── opts/
│ │ ├── fp16-fp32-fp16-1.ssbo.comp
│ │ ├── sabs.frag
│ │ ├── sneg.frag
│ │ ├── wave-read-lane-first-heap.sm66.comp
│ │ ├── wave-read-lane-first.bindless.local-root-signature.rmiss
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.sm60.comp
│ │ ├── wave-read-lane-first.sm60.comp
│ │ ├── wave-read-lane-first.sm66.comp
│ │ ├── wave-read-lane-first.ssbo.comp
│ │ ├── wave-read-lane-first.ssbo.rgen
│ │ ├── wave-read-lane-first.ssbo.sm60.comp
│ │ ├── wave-read-lane-first.ssbo.sm66.comp
│ │ └── wave-read-lane-first.ssbo.sm66.rgen
│ ├── raw-access/
│ │ ├── bab-double1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-half1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-uint1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint3.raw-access-chains.noglsl.ssbo.comp
│ │ └── structured-uint4.raw-access-chains.noglsl.ssbo.comp
│ ├── resources/
│ │ ├── acceleration-structure.bindless.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.raw-va-stride-offset.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.rgen
│ │ ├── acceleration-structure.local-root-signature.root-descriptor.rgen
│ │ ├── basic.input-attachment.frag
│ │ ├── buffer-16bit.ssbo.bindless.comp
│ │ ├── buffer-16bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-16bit.ssbo.comp
│ │ ├── buffer-64bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-64bit.ssbo.comp
│ │ ├── buffer-alignment-fixup.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── cbuf.root-constant.min16float.sm60.frag
│ │ ├── cbuf.root-constant.min16float.sm60.native-fp16.frag
│ │ ├── cbuf.root-constant.min16int.sm60.frag
│ │ ├── cbuf.root-constant.min16int.sm60.native-fp16.frag
│ │ ├── cbv-array-nonuniform.frag
│ │ ├── cbv-array.frag
│ │ ├── cbv-dynamic.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv-indexing.frag
│ │ ├── cbv-indexing.sm66.frag
│ │ ├── cbv-legacy-fp16-fp64.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.native-fp16.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.native-fp16.frag
│ │ ├── cbv.bindless.root-constant.cbv-as-ssbo.frag
│ │ ├── cbv.bindless.root-constant.frag
│ │ ├── cbv.frag
│ │ ├── cbv.no-legacy-cbuf-layout.bindless.frag
│ │ ├── cbv.no-legacy-cbuf-layout.index-divider.frag
│ │ ├── cbv.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv.no-legacy-cbuf-layout.native-fp16.sm60.frag
│ │ ├── cbv.no-legacy-cbuf-layout.root-constant.frag
│ │ ├── cbv.root-constant.frag
│ │ ├── cbv.root-descriptor.no-legacy-cbuf-layout.frag
│ │ ├── combined-image-sampler-reuse.frag
│ │ ├── dynamic-root-constant.root-constant.bindless.root-descriptor.comp
│ │ ├── min16-alloca-groupshared.sm60.comp
│ │ ├── min16float-ssbo-dxr.ssbo.rgen
│ │ ├── raw-buffer-addressing.comp
│ │ ├── raw-buffer-addressing.ssbo.comp
│ │ ├── root-bda.root-descriptor.comp
│ │ ├── root-bda.root-descriptor.sm60.comp
│ │ ├── root-constant-with-bda.root-descriptor.root-constant.comp
│ │ ├── rt-resources.bindless.local-root-signature.rmiss
│ │ ├── rt-resources.bindless.rmiss
│ │ ├── rt-resources.rmiss
│ │ ├── sampler-array.frag
│ │ ├── sampler-indexing.frag
│ │ ├── sampler-indexing.sm66.frag
│ │ ├── sampler.bindless.root-constant.frag
│ │ ├── sm66/
│ │ │ ├── atomics-64bit-groupshared.ssbo.sm66.comp
│ │ │ ├── atomics-64bit.root-descriptor.sm66.comp
│ │ │ ├── atomics-64bit.ssbo.sm66.comp
│ │ │ ├── atomics-component-alias.sm66.comp
│ │ │ ├── atomics-typed-64bit-heap.sm66.comp
│ │ │ ├── atomics-typed-64bit.bindless.sm66.comp
│ │ │ ├── atomics-typed-64bit.sm66.comp
│ │ │ ├── binding-range-selection.bindless.sm66.comp
│ │ │ ├── binding-range-selection.sm66.comp
│ │ │ ├── buffer-64bit-double.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.ssbo-align.sm66.comp
│ │ │ ├── cbuffer-heap.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.bindless.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.sm66.frag
│ │ │ ├── raw-buffer-heap.sm66.frag
│ │ │ ├── raw-buffer-heap.ssbo.sm66.frag
│ │ │ ├── raw-buffer-heap.typed-buffer-offset.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.ssbo-align.sm66.frag
│ │ │ ├── raygen-heap.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.sm66.rgen
│ │ │ ├── raygen.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.sm66.rgen
│ │ │ ├── rw-typed-binding.sm66.frag
│ │ │ ├── rw-typed-heap.sm66.frag
│ │ │ ├── sampled-types-binding.sm66.frag
│ │ │ ├── sampled-types.sm66.frag
│ │ │ ├── sampler-binding.sm66.frag
│ │ │ ├── sampler-heap.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.ssbo-align.sm66.frag
│ │ │ ├── structured-buffer-heap.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.ssbo-align.sm66.frag
│ │ │ └── structured-buffer-heap.typed-buffer-offset.sm66.frag
│ │ ├── srv-array-raw-buffer-nonuniform.frag
│ │ ├── srv-array-raw-buffer.frag
│ │ ├── srv-array-structured-buffer-nonuniform.frag
│ │ ├── srv-array-structured-buffer.frag
│ │ ├── srv-array-texture-nonuniform.frag
│ │ ├── srv-array-texture.frag
│ │ ├── srv-array-typed-buffer-nonuniform.frag
│ │ ├── srv-array-typed-buffer.frag
│ │ ├── srv-indexing.frag
│ │ ├── srv-indexing.sm66.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-raw-buffer.ssbo.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-structured-buffer.ssbo.frag
│ │ ├── srv-texture.bindless.root-constant.frag
│ │ ├── srv-texture.bindless.root-constant.inline-ubo.frag
│ │ ├── srv-typed-buffer.bindless.root-constant.frag
│ │ ├── srv-uav-raw.typed-buffer-offset.comp
│ │ ├── srv-uav.typed-buffer-offset.comp
│ │ ├── ssbo-minprecision.sm60.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.root-descriptor.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.root-descriptor.frag
│ │ ├── subobject-parsing.rgen
│ │ ├── typed-resources-16bit-sparse.frag
│ │ ├── typed-resources-16bit.bindless.frag
│ │ ├── typed-resources-16bit.frag
│ │ ├── typed-resources-16bit.sm60.bindless.frag
│ │ ├── typed-resources-16bit.sm60.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.bindless.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.frag
│ │ ├── uav-array-raw-buffer-nonuniform.frag
│ │ ├── uav-array-raw-buffer.frag
│ │ ├── uav-array-structured-buffer-nonuniform.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.bindless.root-constant.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.frag
│ │ ├── uav-array-structured-buffer.frag
│ │ ├── uav-array-texture-nonuniform.frag
│ │ ├── uav-array-texture.frag
│ │ ├── uav-array-typed-buffer-nonuniform.frag
│ │ ├── uav-array-typed-buffer.frag
│ │ ├── uav-counter-array.ssbo.frag
│ │ ├── uav-counter-array.ssbo.sm66.frag
│ │ ├── uav-counter-array.ssbo.sm66.uav-counter-ssbo.frag
│ │ ├── uav-counter-array.ssbo.uav-counter-ssbo.frag
│ │ ├── uav-counter-heap.sm66.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-ssbo.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-texel-buffer.bindless.ssbo.frag
│ │ ├── uav-counter.bindless.nobda.root-constant.comp
│ │ ├── uav-counter.bindless.nobda.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.heap-raw-va-cbv.comp
│ │ ├── uav-counter.bindless.root-constant.uav-counter-ssbo.comp
│ │ ├── uav-counter.ssbo.comp
│ │ ├── uav-counter.ssbo.raw-va-stride-offset.comp
│ │ ├── uav-counter.ssbo.uav-counter-ssbo.comp
│ │ ├── uav-indexing.frag
│ │ ├── uav-indexing.sm66.frag
│ │ ├── uav-raw-buffer.bindless.root-constant.frag
│ │ ├── uav-raw-buffer.ssbo.frag
│ │ ├── uav-structured-buffer.bindless.root-constant.frag
│ │ ├── uav-typed-buffer.bindless.root-constant.frag
│ │ └── uav-typed.typed-uav-without-format.comp
│ ├── rov/
│ │ ├── rov-bab.bindless.frag
│ │ ├── rov-bab.frag
│ │ ├── rov-bab.ssbo.bindless.frag
│ │ ├── rov-bab.ssbo.frag
│ │ ├── rov-bab.ssbo.root-descriptor.frag
│ │ ├── rov-branch-early-return.frag
│ │ ├── rov-branch.frag
│ │ ├── rov-buffer.frag
│ │ ├── rov-inloop-2.frag
│ │ ├── rov-inloop.frag
│ │ ├── rov-per-sample.sm66.frag
│ │ ├── rov-postloop.frag
│ │ ├── rov-structured.bindless.frag
│ │ ├── rov-structured.frag
│ │ ├── rov-structured.ssbo.bindless.frag
│ │ ├── rov-structured.ssbo.frag
│ │ ├── rov-structured.ssbo.root-descriptor.frag
│ │ ├── rov-tex1d.bindless.frag
│ │ ├── rov-tex1d.frag
│ │ ├── rov-tex1darray.bindless.frag
│ │ ├── rov-tex1darray.frag
│ │ ├── rov-tex2d.bindless.frag
│ │ ├── rov-tex2d.frag
│ │ ├── rov-tex2darray.bindless.frag
│ │ ├── rov-tex2darray.frag
│ │ ├── rov-tex3d.bindless.frag
│ │ ├── rov-tex3d.frag
│ │ ├── rov-undef.frag
│ │ └── rov.sm66.frag
│ ├── sampler-feedback/
│ │ ├── sampler-feedback.frag
│ │ └── sampler-feedback.sm66.frag
│ ├── semantics/
│ │ ├── clip-cull-distance.vert
│ │ ├── clip-cull.frag
│ │ ├── clip-distance-cols.frag
│ │ ├── clip-distance-cols.vert
│ │ ├── clip-distance-flatten.frag
│ │ ├── clip-distance-flatten.vert
│ │ ├── clip-distance-rows.frag
│ │ ├── clip-distance-rows.vert
│ │ ├── clip-distance-single.vert
│ │ ├── coverage.frag
│ │ ├── depth-greater-equal.frag
│ │ ├── depth-less-equal.frag
│ │ ├── depth.frag
│ │ ├── early-depth-stencil.frag
│ │ ├── inner-coverage.noglsl.frag
│ │ ├── is-front-face.frag
│ │ ├── position.frag
│ │ ├── primitive-id.frag
│ │ ├── primitive-id.geom
│ │ ├── render-target-array-index.frag
│ │ ├── render-target-array-index.geom
│ │ ├── sample-rate-pos.frag
│ │ ├── stencil-ref.frag
│ │ ├── sv-shading-rate.noglsl.frag
│ │ ├── sv-shading-rate.noglsl.vert
│ │ ├── view-id.frag
│ │ ├── view-id.vert
│ │ ├── viewport-array-index.frag
│ │ └── viewport-array-index.geom
│ ├── stages/
│ │ ├── boolean-io.vert
│ │ ├── callable-chain.rcall
│ │ ├── callable.rcall
│ │ ├── closesthit.rclosest
│ │ ├── domain-clip-cull.tese
│ │ ├── domain-patch-input-integer-io.tese
│ │ ├── domain.tese
│ │ ├── extra_output.dual-source-blending.frag
│ │ ├── extra_output_reordered.dual-source-blending.frag
│ │ ├── geometry-clip-cull.geom
│ │ ├── geometry-input-line.geom
│ │ ├── geometry-input-lineadj.geom
│ │ ├── geometry-input-point.geom
│ │ ├── geometry-input-triangle.geom
│ │ ├── geometry-input-triangleadj.geom
│ │ ├── geometry-instancing.geom
│ │ ├── geometry-output-line.geom
│ │ ├── geometry-output-point.geom
│ │ ├── geometry-streams.geom
│ │ ├── hull-arrays.tesc
│ │ ├── hull-clip-cull.tesc
│ │ ├── hull-patch-output-integer-io.tesc
│ │ ├── hull-single-cp.tesc
│ │ ├── hull.tesc
│ │ ├── mesh-basic-line.mesh
│ │ ├── mesh-basic.mesh
│ │ ├── mesh-clip-cull.mesh
│ │ ├── raygen-complex-storage-class.rgen
│ │ ├── raygen-skip-inactive-resources.rgen
│ │ ├── raygen.rgen
│ │ ├── raymiss-chain.rmiss
│ │ ├── raymiss.rmiss
│ │ ├── simple.dual-source-blending.frag
│ │ ├── simple.invariant.vert
│ │ ├── stage-input-output.16bit-io.frag
│ │ ├── stage-input-output.frag
│ │ ├── stream-out.stream-out.vert
│ │ ├── swizzle.rt-swizzle.frag
│ │ ├── task-basic.task
│ │ ├── vertex-array-input.vert
│ │ ├── vertex-array-output.vert
│ │ └── vertex-input-remapping.vert
│ ├── vectorization/
│ │ ├── copy-byte-address.ssbo.comp
│ │ ├── copy-composite-2.ssbo.comp
│ │ ├── copy-composite.ssbo.comp
│ │ ├── copy-composite.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double2.ssbo.comp
│ │ ├── copy-double2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double3.ssbo.comp
│ │ ├── copy-double3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double4.ssbo.comp
│ │ ├── copy-float2.ssbo.comp
│ │ ├── copy-float2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float2x2.ssbo.comp
│ │ ├── copy-float3.ssbo.comp
│ │ ├── copy-float3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float4x4.ssbo.comp
│ │ ├── copy-half2.ssbo.comp
│ │ ├── copy-half2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half3.ssbo.comp
│ │ ├── copy-half3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half4.ssbo.comp
│ │ └── copy-half4.ssbo.ssbo-align.bindless.comp
│ ├── view-instancing/
│ │ ├── geom/
│ │ │ ├── basic.view-instancing.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.view-instancing-viewport-offset.last-pre-raster.geom
│ │ │ └── basic.view-instancing.view-instancing-viewport-offset.last-pre-raster.geom
│ │ ├── mesh/
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ ├── basic-few-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-many-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ └── basic.view-instancing.mesh
│ │ ├── tesc/
│ │ │ ├── basic.view-instancing.tesc
│ │ │ └── basic.view-instancing.view-instancing-multiview.tesc
│ │ ├── tese/
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.view-instancing-viewport-offset.last-pre-raster.tese
│ │ │ └── domain.view-instancing.view-instancing-viewport-offset.tese
│ │ └── vert/
│ │ ├── basic.view-instancing.export-layer-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer-viewport.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-layer.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-viewport.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.last-pre-raster.vert
│ │ ├── basic.view-instancing.vert
│ │ ├── basic.view-instancing.view-instance-mask.last-pre-raster.vert
│ │ ├── basic.view-instancing.view-instance-mask.vert
│ │ ├── basic.view-instancing.view-instancing-multiview.vert
│ │ └── basic.view-instancing.view-instancing-viewport-offset.vert
│ └── vkmm/
│ ├── coopmat.sm66.ssbo.vkmm.comp
│ ├── cross_group_sharing.vkmm.node.inline-ubo.comp
│ ├── descriptor_qa.bindless.descriptor-qa.vkmm.comp
│ ├── groupshared.vkmm.comp
│ ├── hull.vkmm.tesc
│ ├── image-load-store.vkmm.comp
│ ├── image-load-store.vkmm.sm66.comp
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.ssbo.vkmm.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent.sm66.ssbo.vkmm.comp
│ │ └── uav-coherent.ssbo.vkmm.comp
│ ├── report-hit.vkmm.rint
│ ├── rov-structured.vkmm.frag
│ ├── rov-tex2d.vkmm.frag
│ └── wmma_ags.h
├── show_graph.py
├── spirv_module.cpp
├── spirv_module.hpp
├── spirv_module_instrumentation.cpp
├── spirv_module_instrumentation.hpp
├── test_shaders.py
├── third_party/
│ ├── CMakeLists.txt
│ ├── bc-decoder/
│ │ ├── llvm_bitreader.h
│ │ ├── llvm_decoder.cpp
│ │ └── llvm_decoder.h
│ ├── cli_parser/
│ │ ├── cli_parser.cpp
│ │ └── cli_parser.hpp
│ └── glslang-spirv/
│ ├── InReadableOrder.cpp
│ ├── Logger.cpp
│ ├── Logger.h
│ ├── SpvBuilder.cpp
│ ├── SpvBuilder.h
│ └── spvIR.h
└── util/
├── thread_local_allocator.cpp
└── thread_local_allocator.hpp
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
# The style used for all options not specifically set in the configuration.
BasedOnStyle: LLVM
# The extra indent or outdent of access modifiers, e.g. public:.
AccessModifierOffset: -4
# If true, aligns escaped newlines as far left as possible. Otherwise puts them into the right-most column.
AlignEscapedNewlinesLeft: true
# If true, aligns trailing comments.
AlignTrailingComments: false
# Allow putting all parameters of a function declaration onto the next line even if BinPackParameters is false.
AllowAllParametersOfDeclarationOnNextLine: false
# Allows contracting simple braced statements to a single line.
AllowShortBlocksOnASingleLine: false
# If true, short case labels will be contracted to a single line.
AllowShortCaseLabelsOnASingleLine: false
# Dependent on the value, int f() { return 0; } can be put on a single line. Possible values: None, Inline, All.
AllowShortFunctionsOnASingleLine: None
# If true, if (a) return; can be put on a single line.
AllowShortIfStatementsOnASingleLine: false
# If true, while (true) continue; can be put on a single line.
AllowShortLoopsOnASingleLine: false
# If true, always break after function definition return types.
AlwaysBreakAfterDefinitionReturnType: false
# If true, always break before multiline string literals.
AlwaysBreakBeforeMultilineStrings: false
# If true, always break after the template<...> of a template declaration.
AlwaysBreakTemplateDeclarations: true
# If false, a function call's arguments will either be all on the same line or will have one line each.
BinPackArguments: true
# If false, a function declaration's or function definition's parameters will either all be on the same line
# or will have one line each.
BinPackParameters: true
# The way to wrap binary operators. Possible values: None, NonAssignment, All.
BreakBeforeBinaryOperators: None
# The brace breaking style to use. Possible values: Attach, Linux, Stroustrup, Allman, GNU.
BreakBeforeBraces: Allman
# If true, ternary operators will be placed after line breaks.
BreakBeforeTernaryOperators: false
# Always break constructor initializers before commas and align the commas with the colon.
BreakConstructorInitializersBeforeComma: true
# The column limit. A column limit of 0 means that there is no column limit.
ColumnLimit: 120
# A regular expression that describes comments with special meaning, which should not be split into lines or otherwise changed.
CommentPragmas: '^ *'
# If the constructor initializers don't fit on a line, put each initializer on its own line.
ConstructorInitializerAllOnOneLineOrOnePerLine: false
# The number of characters to use for indentation of constructor initializer lists.
ConstructorInitializerIndentWidth: 4
# Indent width for line continuations.
ContinuationIndentWidth: 4
# If true, format braced lists as best suited for C++11 braced lists.
Cpp11BracedListStyle: false
# Disables formatting at all.
DisableFormat: false
# A vector of macros that should be interpreted as foreach loops instead of as function calls.
#ForEachMacros: ''
# Indent case labels one level from the switch statement.
# When false, use the same indentation level as for the switch statement.
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
# The number of columns to use for indentation.
IndentWidth: 4
# Indent if a function definition or declaration is wrapped after the type.
IndentWrappedFunctionNames: false
# If true, empty lines at the start of blocks are kept.
KeepEmptyLinesAtTheStartOfBlocks: true
# Language, this format style is targeted at. Possible values: None, Cpp, Java, JavaScript, Proto.
Language: Cpp
# The maximum number of consecutive empty lines to keep.
MaxEmptyLinesToKeep: 1
# The indentation used for namespaces. Possible values: None, Inner, All.
NamespaceIndentation: None
# The penalty for breaking a function call after "call(".
PenaltyBreakBeforeFirstCallParameter: 19
# The penalty for each line break introduced inside a comment.
PenaltyBreakComment: 300
# The penalty for breaking before the first <<.
PenaltyBreakFirstLessLess: 120
# The penalty for each line break introduced inside a string literal.
PenaltyBreakString: 1000
# The penalty for each character outside of the column limit.
PenaltyExcessCharacter: 1000000
# Penalty for putting the return type of a function onto its own line.
PenaltyReturnTypeOnItsOwnLine: 1000000000
# Pointer and reference alignment style. Possible values: Left, Right, Middle.
PointerAlignment: Right
# If true, a space may be inserted after C style casts.
SpaceAfterCStyleCast: false
# If false, spaces will be removed before assignment operators.
SpaceBeforeAssignmentOperators: true
# Defines in which cases to put a space before opening parentheses. Possible values: Never, ControlStatements, Always.
SpaceBeforeParens: ControlStatements
# If true, spaces may be inserted into '()'.
SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
SpacesBeforeTrailingComments: 1
# If true, spaces will be inserted after '<' and before '>' in template argument lists.
SpacesInAngles: false
# If true, spaces may be inserted into C style casts.
SpacesInCStyleCastParentheses: false
# If true, spaces are inserted inside container literals (e.g. ObjC and Javascript array and dict literals).
SpacesInContainerLiterals: false
# If true, spaces will be inserted after '(' and before ')'.
SpacesInParentheses: false
# If true, spaces will be inserted after '[' and befor']'.
SpacesInSquareBrackets: false
# Format compatible with this standard, e.g. use A<A<int> > instead of A<A<int>> for LS_Cpp03. Possible values: Cpp03, Cpp11, Auto.
Standard: Cpp11
# The number of columns used for tab stops.
TabWidth: 4
# The way to use tab characters in the resulting file. Possible values: Never, ForIndentation, Always.
UseTab: ForIndentation
# Do not reflow comments
ReflowComments: false
================================================
FILE: .gitattributes
================================================
shaders/**/* linguist-language=GLSL
reference/**/* linguist-generated
================================================
FILE: .gitignore
================================================
/cmake-build-debug
/cmake-build-release
*.iml
/.idea
/.vs
/.vscode
/external/dxc*
/external/DirectXShaderCompiler
/external/llvm
/shaders-dxil
/shaders-dxbc
/reference/shaders-dxil
/reference/shaders-dxbc
/build
/out/build
================================================
FILE: .gitmodules
================================================
[submodule "third_party/spirv-headers"]
path = third_party/spirv-headers
url = https://github.com/KhronosGroup/SPIRV-Headers
[submodule "third_party/SPIRV-Tools"]
path = third_party/SPIRV-Tools
url = https://github.com/KhronosGroup/SPIRV-Tools
[submodule "third_party/SPIRV-Cross"]
path = third_party/SPIRV-Cross
url = https://github.com/KhronosGroup/SPIRV-Cross
[submodule "third_party/dxbc-spirv"]
path = subprojects/dxbc-spirv
url = https://github.com/doitsujin/dxbc-spirv
================================================
FILE: CMakeLists.txt
================================================
#
# Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
project(dxil-spirv LANGUAGES CXX C)
add_library(dxil-debug STATIC debug/logging.hpp debug/logging.cpp)
target_include_directories(dxil-debug PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/debug)
set_target_properties(dxil-debug PROPERTIES POSITION_INDEPENDENT_CODE ON)
option(DXIL_SPIRV_CLI "Enable CLI support." ON)
option(DXIL_SPIRV_NATIVE_LLVM "Enable native LLVM support." OFF)
include(GNUInstallDirs)
if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"))
set(DXIL_SPV_CXX_FLAGS -Wall -Wextra -Wno-missing-field-initializers -Wno-empty-body -Wno-unused-parameter -fno-exceptions -fno-rtti -fvisibility=hidden)
elseif (MSVC)
set(DXIL_SPV_CXX_FLAGS /D_CRT_SECURE_NO_WARNINGS /wd4996 /wd4244 /wd4267 /wd4244 /wd4309 /wd4005 /MP /DNOMINMAX)
endif()
add_library(dxil-utils STATIC util/thread_local_allocator.hpp util/thread_local_allocator.cpp)
target_include_directories(dxil-utils PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/util)
target_compile_options(dxil-utils PRIVATE ${DXIL_SPV_CXX_FLAGS})
set_target_properties(dxil-utils PROPERTIES POSITION_INDEPENDENT_CODE ON)
add_subdirectory(third_party EXCLUDE_FROM_ALL)
add_subdirectory(bc EXCLUDE_FROM_ALL)
add_subdirectory(external EXCLUDE_FROM_ALL)
add_library(spirv-module STATIC
ir.hpp
descriptor_qa.cpp descriptor_qa.hpp
spirv_module.hpp spirv_module.cpp
spirv_module_instrumentation.hpp spirv_module_instrumentation.cpp)
set_target_properties(spirv-module PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(spirv-module PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(spirv-module PUBLIC glslang-spirv-builder dxil-spirv-headers)
target_link_libraries(spirv-module PRIVATE dxil-utils dxil-debug)
target_compile_options(spirv-module PRIVATE ${DXIL_SPV_CXX_FLAGS})
add_library(dxil-converter STATIC
memory_stream.hpp memory_stream.cpp
llvm_bitcode_parser.hpp llvm_bitcode_parser.cpp
dxil.hpp
dxil_converter.hpp dxil_converter.cpp
cfg_structurizer.hpp cfg_structurizer.cpp
node_pool.hpp node_pool.cpp
node.hpp node.cpp
dxil_parser.hpp dxil_parser.cpp
scratch_pool.hpp
opcodes/converter_impl.hpp
opcodes/opcodes.hpp
opcodes/dxil/dxil_common.hpp opcodes/dxil/dxil_common.cpp
opcodes/dxil/dxil_resources.hpp opcodes/dxil/dxil_resources.cpp
opcodes/dxil/dxil_compute.hpp opcodes/dxil/dxil_compute.cpp
opcodes/dxil/dxil_arithmetic.hpp opcodes/dxil/dxil_arithmetic.cpp
opcodes/dxil/dxil_pixel_ops.hpp opcodes/dxil/dxil_pixel_ops.cpp
opcodes/dxil/dxil_geometry.hpp opcodes/dxil/dxil_geometry.cpp
opcodes/dxil/dxil_tessellation.hpp opcodes/dxil/dxil_tessellation.cpp
opcodes/dxil/dxil_waveops.hpp opcodes/dxil/dxil_waveops.cpp
opcodes/dxil/dxil_sampling.hpp opcodes/dxil/dxil_sampling.cpp
opcodes/dxil/dxil_buffer.hpp opcodes/dxil/dxil_buffer.cpp
opcodes/dxil/dxil_ray_tracing.hpp opcodes/dxil/dxil_ray_tracing.cpp
opcodes/dxil/dxil_mesh.hpp opcodes/dxil/dxil_mesh.cpp
opcodes/dxil/dxil_workgraph.hpp opcodes/dxil/dxil_workgraph.cpp
opcodes/dxil/dxil_ags.hpp opcodes/dxil/dxil_ags.cpp
opcodes/dxil/dxil_nvapi.hpp opcodes/dxil/dxil_nvapi.cpp
opcodes/opcodes_llvm_builtins.hpp opcodes/opcodes_llvm_builtins.cpp
opcodes/opcodes_dxil_builtins.hpp opcodes/opcodes_dxil_builtins.cpp)
set_target_properties(dxil-converter PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(dxil-converter PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_options(dxil-converter PRIVATE ${DXIL_SPV_CXX_FLAGS})
target_link_libraries(dxil-converter PRIVATE dxil-debug external::llvm dxil-utils)
target_link_libraries(dxil-converter PUBLIC spirv-module)
add_library(dxil-spirv-c-shared SHARED dxil_spirv_c.h dxil_spirv_c.cpp)
target_include_directories(dxil-spirv-c-shared
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/dxil-spirv>)
target_link_libraries(dxil-spirv-c-shared PRIVATE dxil-debug dxil-converter external::llvm dxil-utils)
target_compile_options(dxil-spirv-c-shared PRIVATE ${DXIL_SPV_CXX_FLAGS})
target_compile_definitions(dxil-spirv-c-shared PRIVATE DXIL_SPV_EXPORT_SYMBOLS)
set_target_properties(dxil-spirv-c-shared PROPERTIES PUBLIC_HEADERS dxil_spirv_c.h)
if (WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
target_link_libraries(dxil-spirv-c-shared PRIVATE -static gcc stdc++ winpthread)
endif()
# If we're linking in full LLVM statically, ensure we don't export all LLVM symbols.
if (NOT MSVC AND DXIL_SPIRV_NATIVE_LLVM)
set_target_properties(dxil-spirv-c-shared PROPERTIES LINK_FLAGS "-Wl,--version-script ${CMAKE_CURRENT_SOURCE_DIR}/link.T")
endif()
add_library(dxil-spirv-c-static STATIC dxil_spirv_c.h dxil_spirv_c.cpp)
target_include_directories(dxil-spirv-c-static
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/dxil-spirv>)
target_link_libraries(dxil-spirv-c-static PRIVATE dxil-debug dxil-converter external::llvm dxil-utils)
target_compile_options(dxil-spirv-c-static PRIVATE ${DXIL_SPV_CXX_FLAGS})
set_target_properties(dxil-spirv-c-static PROPERTIES PUBLIC_HEADERS dxil_spirv_c.h)
set_target_properties(dxil-spirv-c-static PROPERTIES POSITION_INDEPENDENT_CODE ON)
if (DXIL_SPIRV_CLI)
add_library(cli-parser STATIC
third_party/cli_parser/cli_parser.hpp
third_party/cli_parser/cli_parser.cpp)
target_include_directories(cli-parser PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/third_party/cli_parser)
target_link_libraries(cli-parser PUBLIC dxil-debug)
target_compile_options(cli-parser PRIVATE ${DXIL_SPV_CXX_FLAGS})
add_executable(dxil-spirv dxil_spirv.cpp)
add_executable(dxil-extract dxil_extract.cpp)
target_link_libraries(dxil-spirv PRIVATE dxil-spirv-c-shared cli-parser SPIRV-Tools-static spirv-cross-c dxil-debug)
target_compile_options(dxil-spirv PRIVATE ${DXIL_SPV_CXX_FLAGS})
target_link_libraries(dxil-extract PRIVATE dxil-spirv-c-shared cli-parser external::llvm)
target_compile_options(dxil-extract PRIVATE ${DXIL_SPV_CXX_FLAGS})
if (WIN32 AND CMAKE_COMPILER_IS_GNUCXX)
target_link_libraries(dxil-spirv PRIVATE -static gcc stdc++ winpthread)
target_link_libraries(dxil-extract PRIVATE -static gcc stdc++ winpthread)
endif()
if (NOT DXIL_SPV_NATIVE_LLVM)
add_executable(dxbc-spirv-sandbox dxbc_spirv_sandbox.cpp)
target_link_libraries(dxbc-spirv-sandbox PRIVATE
dxil-utils dxil-debug llvm-bc dxil-converter
dxbc-spirv dxbc-spirv-test
spirv-cross-c SPIRV-Tools-static)
endif()
endif()
set(DXIL_SPV_VERSION_MAJOR 2)
set(DXIL_SPV_VERSION_MINOR 66)
set(DXIL_SPV_VERSION_PATCH 0)
set(DXIL_SPV_VERSION ${DXIL_SPV_VERSION_MAJOR}.${DXIL_SPV_VERSION_MINOR}.${DXIL_SPV_VERSION_PATCH})
set_target_properties(dxil-spirv-c-shared PROPERTIES
VERSION ${DXIL_SPV_VERSION}
SOVERSION ${DXIL_SPV_VERSION_MAJOR})
set(DXIL_SPV_INSTALL_LIB_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(DXIL_SPV_INSTALL_INC_DIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/dxil-spirv)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pkg-config/dxil-spirv-c-shared.pc.in
${CMAKE_CURRENT_BINARY_DIR}/dxil-spirv-c-shared.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dxil-spirv-c-shared.pc DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
if (DXIL_SPIRV_CLI)
install(TARGETS dxil-spirv RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS dxil-extract RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dxil_spirv_c.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dxil-spirv)
install(TARGETS dxil-spirv-c-shared
EXPORT dxil_spirv_c_sharedConfig
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dxil-spirv)
install(EXPORT dxil_spirv_c_sharedConfig DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/dxil_spirv_c_shared/cmake)
option(DXIL_SPV_MISC_CLI "Enable misc CLI apps." OFF)
if (DXIL_SPV_MISC_CLI)
add_executable(structurize-test misc/structurize_test.cpp)
target_link_libraries(structurize-test PRIVATE dxil-converter SPIRV-Tools-static spirv-cross-c dxil-debug dxil-utils)
target_compile_options(structurize-test PRIVATE ${DXIL_SPV_CXX_FLAGS})
endif()
================================================
FILE: DESCRIPTORS.md
================================================
# Full SM 6.0+ descriptor compatibility in Vulkan
In this document, I aim to rethink how we implement descriptors.
The goal is to efficiently implement descriptors even in bindless scenarios, i.e. SM 5.1/6.0+.
## Descriptor heaps in D3D12
The API lets you allocate a descriptor heap with N elements. Each element can be a SRV, UAV or CBV or any arbitrary type.
The API exposes some kind of "stride" here, which implies that max(sizeof(SRV), sizeof(UAV), sizeof(CBV)) is some value, i.e. 32 on drivers I've tested.
## Root signatures
Here we can specify up to 64 DWORDs (256 bytes) which gets passed to the shader.
- Descriptor table pointer: 1 DWORD, (not two? interesting ...)
- Root descriptor (UAV/CBV), apparently not bounds checked? (2 DWORD)
- Root constants (1 DWORD each)
First thought that comes to mind is that a descriptor table pointer can correlate to a descriptor set, but this will not work.
We only have 8 descriptor sets available. (4 is technically min-spec, but only some mobile chips expose that. I think it's fair to rely on 8.)
### Descriptor table pointer as an offset
A weird design of D3D12 is SetDescriptorHeaps which lets you bind only two heaps, one SRV/CBV/UAV heap and one SAMPLER heap, and all descriptor table pointers
must refer to one of these.
Looking at the descriptor table pointer only taking 1 DWORD this starts making sense. We should just encode offsets here into the two heaps.
SetDesciptorHeaps now becomes vkCmdBindDescriptorSets directly. The root signature becomes push constants (for 256 byte implementations),
or spills into a versioned uniform buffer (for 128 byte implementations and root sig > 128 bytes, which should be rare).
### Descriptor types
While descriptor types are kind of irrelevant in D3D12 inside heaps, we have very particular types in Vulkan.
`SAMPLED_IMAGE`, `UNIFORM_TEXEL_BUFFER`, `STORAGE_TEXEL_BUFFER`, `UNIFORM_BUFFER` and friends. Ideally, we'd have a "GENERAL" descriptor type which could be anything and we'd save on a lot of bloat in this scenario.
With a descriptor heap, we do not know the root signature yet, so we have two choices on how to allocate the descriptors, either with `VARIABLE_COUNT` or not.
With `VARIABLE_COUNT` we can declare descriptor set layouts which have the maximum number of bindings we expect to support (At least 1M according to Tier2),
and then allocating the descriptor pools we can allocate just the right amount of descriptors. This seems like the correct approach.
Two effects of this is that each descriptor type must live in their own descriptor sets, as only one descriptor binding can have VARYING count.
So far, we thus have 6 descriptor set layouts which will be common across all pipelines. Each set contains one binding, with VARYING size array of that type.
- Set0: `SAMPLED_IMAGE` - Texture
- Set1: `UNIFORM_TEXEL_BUFFER` - TypedBuffer, StructuredBuffer, ByteAddressBuffer
- Set2: `STORAGE_TEXEL_BUFFER` - RWTypedBuffer, RWStructuredBuffer, RWByteAddressBuffer. Descriptors come in pairs of two, the odd indices can deal with UAV counters.
- Set3: `STORAGE_IMAGE`
- Set4: `UNIFORM_BUFFER`
- Set5: `SAMPLER`
This leaves three sets which can be derived from a root signature directly. These include:
- Set6: Immutable samplers. It's useful to keep these in their own set since we don't have to deal with push descriptor restrictions of having to push immutable samplers
(and thus having to keep track of them as well).
- Set4 (reuse `UNIFORM_BUFFER` set): Virtualized bindings. These are bindings we have to repack from descriptor heaps to support implementations with few CBVs (like older Nvidia cards).
Due to RS 1.0 volatile descriptor behavior (descriptor needs only be valid in GPU timeline and can change anytime)
we need to defer the actual vkUpdateDescriptorSet calls to QueueSubmit() time. Using a descriptor update template here would be nice!
Virtualized bindings is currently the *only* path used by vkd3d and it crumbles down for any interesting uses of SM 5.1 and up, i.e. larger arrays of resources.
If we use virtualized descriptors, we can pilfer the set used for uniform buffers as that's the descriptor type we're going to virtualize anyways.
- Set7 (reuse `UNIFORM_BUFFER` set): Versioned push descriptor set. Here we can place:
- Root constants which spill outside maxPushConstantSize
- Root descriptors
For implementations which don't support push descriptors, we can fallback to a versioned descriptor set instead, just like vkd3d does.
#### Why not `STORAGE_BUFFER` for buffer UAVs?
Alignment is a big issue for SSBOs, especially on Nvidia. StructuredBuffers can be bound at very awkward alignments and only `STORAGE_TEXEL_BUFFER` of R32UI can express those.
This might lead us into an awkward path when dealing with 16-bit load/store in SM 6.2. Using physical storage buffers (PSB) for untyped buffers would be great, but we need to consider out-of-bounds behavior, which PSB does not support. Also, if we go the PSB route, we will have another indirection to consider. Since rather than going:
- Load UAV descriptor
- Load/Store data
we end up with:
- Load CBV/UAV descriptor
- Load PSB pointer
- Load/store data
## Sample shader
```
layout(push_constant) uniform RootConstants
{
uint descriptor_table_offset0;
uint descriptor_table_offset1;
uint descriptor_table_offset2;
uint descriptor_table_offset3;
uint root_constant0;
uint root_constant1;
uint root_constant2;
uint root_constant3;
} root;
// We can alias descriptors.
layout(set = 0, binding = 0) uniform texture2D Tex2D[];
layout(set = 0, binding = 0) uniform texture3D Tex3D[];
layout(set = 1, binding = 0) textureBuffer TypedBuffers[];
layout(set = 1, binding = 0) textureBuffer StructuredBuffers[];
layout(set = 1, binding = 0) textureBuffer ByteAddressBuffers[];
layout(set = 2, binding = 0) imageBuffer RWTypedBuffers[];
layout(set = 2, binding = 1, r32ui) uimageBuffer RWStructureBuffers[];
layout(set = 2, binding = 2, r32ui) uimageBuffer RWByteAddressBuffers[];
layout(set = 3, binding = 0) uniform image2D RWTex2D[];
layout(set = 3, binding = 0) uniform image3D RWTex3D[];
#if SUPPORTS_MANY_CBVS
layout(set = 4, binding = 0, std140) uniform UBOs
{
vec4 data[MAX_SIZE];
} CBV[];
#else
// Versioned descriptors.
layout(set = 4, binding = 0, std140) uniform UBO0
{
vec4 data[MAX_SIZE];
} ubo0;
layout(set = 4, binding = 1, std140) uniform UBO0
{
vec4 data[MAX_SIZE];
} ubo0;
#endif
layout(set = 5, binding = 0) uniform sampler DynamicSamplers[];
layout(set = 6, binding = 0) uniform sampler ImmutableSampler0;
layout(set = 6, binding = 1) uniform sampler ImmutableSampler1;
layout(set = 6, binding = 2) uniform sampler ImmutableSampler2;
// Root descriptors.
layout(set = 7, binding = 0) uniform RootCBV0
{
vec4 data[MAX_SIZE];
} root_cbv0;
layout(set = 7, binding = 1) uniform RootCBV1
{
vec4 data[MAX_SIZE];
} root_cbv1;
void main()
{
const uint OffsetIntoRootTable = 42; // This is deduced from D3D12_DESCRIPTOR_RANGE.
// descriptor_table_offset is offset into a SetDescriptorHeaps, which we can find by looking at
// SetGraphicsRootDescriptor table compared to SetDescriptorHeaps.
// Tack on nonuniformEXT as required by IL.
texelFetch(Tex2D[OffsetIntoRootTable + root.descriptor_table_offset1]);
}
================================================
FILE: LICENSE.MIT
================================================
Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
SPDX-License-Identifier: MIT
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For third_party/bc-decoder:
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2019-2020 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
For third_party/glslang-spirv (glslang):
--------------------------------------------------------------------------------
The MIT License
--------------------------------------------------------------------------------
Copyright 2020 The Khronos Group Inc
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
# dxil-spirv
This project aims to provide translation of DXIL (SM 6.x) shaders to SPIR-V which can be used in the vkd3d project,
which implements D3D12 on top of Vulkan.
Using [dxbc-spirv](https://github.com/doitsujin/dxbc-spirv) it also handles legacy DXBC shaders.
## Building
### Dependencies
Check out submodules first with `git submodule update --init --recursive`.
No external dependencies apart from the submodules are required to build.
This project implements a "small" LLVM C++ API subset which acts as a drop-in replacement for the full LLVM.
It is possible to build against the true LLVM C++ API if llvm is checked out in `external/llvm` and `-DDXIL_SPIRV_NATIVE_LLVM=ON` CMake option is used.
See `checkout_llvm.sh` script.
### Build
Standard CMake build.
```shell
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
```
## Linking against dxil-spirv
Only the C API is installed and is expected to be kept ABI/API stable when it releases.
### pkg-config
```shell
pkg-config dxil-spirv-c-shared --cflags --libs
```
### CMake module
Something like:
```
find_package(dxil_spirv_c_shared)
if (dxil_spirv_c_shared_FOUND)
message("Found dxil-spirv! Enabling DXIL support.")
target_link_libraries(vkd3d-shader PRIVATE dxil-spirv-c-shared)
target_compile_definitions(vkd3d-shader PRIVATE HAVE_DXIL_SPV)
target_sources(vkd3d-shader PRIVATE vkd3d/libs/vkd3d-shader/dxil.c)
else()
message("Did not find dxil-spirv :( Disabling DXIL support.")
endif()
```
## Testing
The primary method of testing dxil-spirv and avoiding regressions is through a reference shader suite.
### Build DXC
First, build DXC. To keep output consistent, we must use a fixed version of DXC.
Currently, this only works on Linux, the Windows build of DXC does not seem to support CMake properly.
```shell
./checkout_dxc.sh
./build_dxc.sh
```
The test suite accepts an arbitrary path to DXC, so if you have a standalone binary somewhere, that can work as well.
### Run test suite
When adding new tests, place the HLSL test in `shaders/` somewhere and run:
```shell
./test_shaders.py shaders --dxc external/dxc-build/bin/dxc --dxil-spirv cmake-build-debug/dxil-spirv
```
If there is any mismatch, the test script will complain. If there are legitimate changes to be made,
add `--update` to the command. The updated files should now be committed alongside the dxil-spirv change.
`--parallel` can (and should) be used to speed up the process.
To update DXBC references, run:
```shell
./cmake-build-debug/dxbc-spirv-sandbox ./reference-dxbc
```
### Running large repro suites
For internal development, we also have an extensive repro suite which cover real-world content.
These cannot be made public for obvious reasons, so the intent is that symlinks are set up during development.
Shaders can be dumped with `VKD3D_SHADER_DUMP_PATH`.
```shell
# The scripts might not work properly if the paths aren't laid out like this.
ln -s ${DXIL_SPIRV_REPO}/shaders shaders-dxil
ln -s ${DXBC_SPIRV_REPO}/shaders shaders-dxbc
ln -s ${DXIL_SPIRV_REPO}/reference/shaders reference/shaders-dxil
ln -s ${DXBC_SPIRV_REPO}/reference/shaders reference/shaders-dxbc
./test_shaders.py shaders-dxil --dxil-spirv cmake-build-release/dxil-spirv --parallel --update
./test_shaders.py shaders-dxbc --dxil-spirv cmake-build-release/dxil-spirv --parallel --update
```
To import shaders into the suite:
```shell
mkdir shaders-dxil/dxilgame
mkdir shaders-dxbc/dxbcgame
# For DXIL
./copy_reference_shaders.py --dxil /tmp/path/to/vkd3d-shader-dump-path --raw --output shaders-dxil/dxilgame
# For DXBC
./copy_reference_shaders.py --dxbc /tmp/path/to/vkd3d-shader-dump-path --raw --output shaders-dxbc/dxbcgame
```
To run an isolated subfolder only, there's `--subfolder`.
## License
dxil-spirv is currently licensed as MIT. See LICENSE.MIT for more details.
```c
/* Copyright (c) 2019-2025 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
```
================================================
FILE: bc/CMakeLists.txt
================================================
add_library(llvm-bc STATIC
cast.hpp iterator.hpp
data_structures.hpp
value.hpp value.cpp
instruction.hpp instruction.cpp
function.hpp function.cpp
context.hpp context.cpp
type.hpp type.cpp
module.hpp module.cpp module_dxbc_ir.cpp
metadata.hpp metadata.cpp
disassembler.cpp)
target_compile_options(llvm-bc PRIVATE ${DXIL_SPV_CXX_FLAGS})
target_compile_definitions(llvm-bc PUBLIC HAVE_LLVMBC)
target_link_libraries(llvm-bc PRIVATE bc-decoder dxil-debug dxil-utils)
target_include_directories(llvm-bc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(llvm-bc PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(llvm-bc PRIVATE dxbc-spirv)
================================================
FILE: bc/cast.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "logging.hpp"
#include "metadata.hpp"
#include "type.hpp"
#include "value.hpp"
#include <exception>
namespace LLVMBC
{
struct ModuleParseContext;
template <typename T>
inline T *cast(Type *type)
{
if (type->getTypeID() != T::get_type_id())
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
return static_cast<T *>(type);
}
template <typename T>
inline const T *cast(const Type *type)
{
if (type->getTypeID() != T::get_type_id())
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
return static_cast<const T *>(type);
}
template <typename T>
inline T *dyn_cast(Type *type)
{
if (!type)
return nullptr;
if (type->getTypeID() != T::get_type_id())
return nullptr;
else
return static_cast<T *>(type);
}
template <typename T>
inline const T *dyn_cast(const Type *type)
{
if (!type)
return nullptr;
if (type->getTypeID() != T::get_type_id())
return nullptr;
else
return static_cast<const T *>(type);
}
template <typename T>
inline bool isa(const Type *type)
{
return type->getTypeID() == T::get_type_id();
}
class ValueProxy : public Value
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Proxy;
}
ValueProxy(Type *type, ModuleParseContext &context, uint64_t id);
Value *get_proxy_value() const;
bool resolve();
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
uint64_t id;
ModuleParseContext &context;
Value *proxy = nullptr;
};
namespace Internal
{
inline Value *resolve_proxy(Value *value);
inline const Value *resolve_proxy(const Value *value);
} // namespace Internal
template <typename T>
inline T *cast(Value *value)
{
if (T::get_value_kind() != ValueKind::Proxy)
value = Internal::resolve_proxy(value);
if (T::is_base_of_value_kind(value->get_value_kind()))
return static_cast<T *>(value);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline const T *cast(const Value *value)
{
if (T::get_value_kind() != ValueKind::Proxy)
value = Internal::resolve_proxy(value);
if (T::is_base_of_value_kind(value->get_value_kind()))
return static_cast<const T *>(value);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline T *dyn_cast(Value *value)
{
if (!value)
return nullptr;
if (T::get_value_kind() != ValueKind::Proxy)
value = Internal::resolve_proxy(value);
if (T::is_base_of_value_kind(value->get_value_kind()))
return static_cast<T *>(value);
else
return nullptr;
}
template <typename T>
inline const T *dyn_cast(const Value *value)
{
if (!value)
return nullptr;
if (T::get_value_kind() != ValueKind::Proxy)
value = Internal::resolve_proxy(value);
if (T::is_base_of_value_kind(value->get_value_kind()))
return static_cast<const T *>(value);
else
return nullptr;
}
template <typename T>
inline bool isa(const Value *value)
{
if (T::get_value_kind() != ValueKind::Proxy)
value = Internal::resolve_proxy(value);
return T::is_base_of_value_kind(value->get_value_kind());
}
namespace Internal
{
inline Value *resolve_proxy(Value *value)
{
while (value && value->get_value_kind() == ValueKind::Proxy)
value = cast<ValueProxy>(value)->get_proxy_value();
return value;
}
inline const Value *resolve_proxy(const Value *value)
{
while (value && value->get_value_kind() == ValueKind::Proxy)
value = cast<ValueProxy>(value)->get_proxy_value();
return value;
}
} // namespace Internal
template <typename T>
inline T *cast(MDOperand &md)
{
if (md.get_metadata_kind() == T::get_metadata_kind())
return static_cast<T *>(&md);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline T *cast(MDOperand *md)
{
if (md->get_metadata_kind() == T::get_metadata_kind())
return static_cast<T *>(md);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline const T *cast(const MDOperand &md)
{
if (md.get_metadata_kind() == T::get_metadata_kind())
return static_cast<const T *>(&md);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline const T *cast(const MDOperand *md)
{
if (md->get_metadata_kind() == T::get_metadata_kind())
return static_cast<const T *>(md);
else
{
LOGE("Invalid type ID in cast<T>.\n");
std::terminate();
}
}
template <typename T>
inline T *dyn_cast(MDOperand &md)
{
if (md.get_metadata_kind() == T::get_metadata_kind())
return static_cast<T *>(&md);
else
return nullptr;
}
template <typename T>
inline T *dyn_cast(MDOperand *md)
{
if (!md)
return nullptr;
if (md->get_metadata_kind() == T::get_metadata_kind())
return static_cast<T *>(md);
else
return nullptr;
}
template <typename T>
inline const T *dyn_cast(const MDOperand &md)
{
if (md.get_metadata_kind() == T::get_metadata_kind())
return static_cast<const T *>(&md);
else
return nullptr;
}
template <typename T>
inline const T *dyn_cast(const MDOperand *md)
{
if (!md)
return nullptr;
if (md->get_metadata_kind() == T::get_metadata_kind())
return static_cast<const T *>(md);
else
return nullptr;
}
template <typename T>
inline bool isa(const MDOperand &md)
{
return md.get_metadata_kind() == T::get_metadata_kind();
}
template <typename T>
inline bool isa(const MDOperand *md)
{
return md->get_metadata_kind() == T::get_metadata_kind();
}
} // namespace LLVMBC
================================================
FILE: bc/context.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "context.hpp"
#include <stdlib.h>
namespace LLVMBC
{
LLVMContext::LLVMContext()
{
}
LLVMContext::~LLVMContext()
{
for (size_t i = typed_allocations.size(); i; i--)
typed_allocations[i - 1]->run();
for (size_t i = raw_allocations.size(); i; i--)
dxil_spv::free_in_thread(raw_allocations[i - 1]);
}
void *LLVMContext::allocate_from_chain(uintptr_t size, uintptr_t align)
{
current_block = (current_block + align - 1) & ~(align - 1);
if (current_block + size <= current_block_end)
{
void *ret = reinterpret_cast<void *>(current_block);
current_block += size;
return ret;
}
else
{
current_block = 0;
current_block_end = 0;
return nullptr;
}
}
void LLVMContext::allocate_new_chain(size_t size, size_t align)
{
size_t min_size = size + align;
if (min_size < 64 * 1024)
min_size = 64 * 1024;
void *ptr = dxil_spv::allocate_in_thread(min_size);
if (ptr)
{
raw_allocations.push_back(ptr);
current_block = reinterpret_cast<uintptr_t>(ptr);
current_block_end = current_block + min_size;
}
else
{
current_block = 0;
current_block_end = 0;
}
}
void *LLVMContext::allocate(size_t size, size_t align)
{
void *ptr = allocate_from_chain(size, align);
if (!ptr)
{
allocate_new_chain(size, align);
ptr = allocate_from_chain(size, align);
}
return ptr;
}
} // namespace LLVMBC
================================================
FILE: bc/context.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "data_structures.hpp"
#include <exception>
#include <stdint.h>
#include <stddef.h>
namespace LLVMBC
{
class Type;
class LLVMContext
{
public:
LLVMContext();
~LLVMContext();
void operator=(const LLVMContext &) = delete;
LLVMContext(const LLVMContext &) = delete;
template <typename T, typename... U>
T *construct(U &&... u)
{
T *mem = static_cast<T *>(allocate(sizeof(T), alignof(T)));
if (!mem)
std::terminate();
T *t = new (mem) T(std::forward<U>(u)...);
if (!std::is_trivially_destructible<T>::value)
append_typed_destructor(t);
return t;
}
template <typename T, typename... U>
T *construct_n(size_t n, const U &... u)
{
T *mem = static_cast<T *>(allocate(sizeof(T) * n, alignof(T)));
if (!mem)
std::terminate();
for (size_t i = 0; i < n; i++)
{
T *tmp = new (&mem[i]) T(u...);
if (!std::is_trivially_destructible<T>::value)
append_typed_destructor(tmp);
}
return mem;
}
Vector<Type *> &get_type_cache()
{
return type_cache;
}
private:
void *allocate(size_t size, size_t align);
struct Deleter
{
virtual ~Deleter() = default;
virtual void run() = 0;
};
template <typename T>
struct TypedDeleter : Deleter
{
explicit TypedDeleter(T *ptr_)
: ptr(ptr_)
{
}
void run() override
{
ptr->~T();
}
T *ptr;
};
uintptr_t current_block = 0;
uintptr_t current_block_end = 0;
void *allocate_from_chain(uintptr_t size, uintptr_t align);
void allocate_new_chain(size_t size, size_t align);
Vector<void *> raw_allocations;
Vector<Deleter *> typed_allocations;
Vector<Type *> type_cache;
template <typename T, typename... U>
T *construct_trivial(U &&... u)
{
T *mem = static_cast<T *>(allocate(sizeof(T), alignof(T)));
if (!mem)
std::terminate();
T *t = new (mem) T(std::forward<U>(u)...);
return t;
}
template <typename T>
void append_typed_destructor(T *ptr)
{
typed_allocations.push_back(construct_trivial<TypedDeleter<T>>(ptr));
}
};
} // namespace LLVMBC
================================================
FILE: bc/data_structures.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "thread_local_allocator.hpp"
namespace LLVMBC
{
template <typename T>
using Vector = dxil_spv::Vector<T>;
template <typename T>
using UnorderedSet = dxil_spv::UnorderedSet<T>;
template <typename Key, typename Value>
using UnorderedMap = dxil_spv::UnorderedMap<Key, Value>;
using String = dxil_spv::String;
using StringStream = dxil_spv::StringStream;
}
================================================
FILE: bc/disassembler.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "cast.hpp"
#include "context.hpp"
#include "function.hpp"
#include "instruction.hpp"
#include "metadata.hpp"
#include "module.hpp"
#include "type.hpp"
#include "value.hpp"
#include <assert.h>
#include <sstream>
#include <type_traits>
namespace LLVMBC
{
struct StreamState
{
StringStream stream;
unsigned indent = 0;
void append(Type *type);
void append(IntegerType *type);
void append(PointerType *type);
void append(ArrayType *type);
void append(StructType *type);
void append(FunctionType *type);
void append(VectorType *type);
void append(const String &str);
void append(Value *value, bool decl = false);
void append(GlobalVariable *value, bool decl = false);
void append(Instruction *value);
void append(Argument *value, bool decl = false);
void append(ShuffleVectorInst *shuf, bool decl = false);
void append(ExtractElementInst *extr, bool decl = false);
void append(InsertElementInst *inst, bool decl = false);
void append(Function *value, bool decl = false);
void append(BinaryOperator *value, bool decl = false);
void append(UnaryOperator *uop, bool decl = false);
void append(CallInst *value, bool decl = false);
void append(BranchInst *value, bool decl = false);
void append(SwitchInst *branch, bool decl = false);
void append(ReturnInst *value, bool decl = false);
void append(UndefValue *value, bool decl = false);
void append(Constant *value, bool decl = false);
void append(ConstantInt *value, bool decl = false);
void append(ConstantFP *value, bool decl = false);
void append(BasicBlock *bb, bool decl = false);
void append(FCmpInst *value, bool decl = false);
void append(ICmpInst *value, bool decl = false);
void append(PHINode *value, bool decl = false);
void append(CastInst *value, bool decl = false);
void append(SelectInst *value, bool decl = false);
void append(ExtractValueInst *value, bool decl = false);
void append(AllocaInst *value, bool decl = false);
void append(GetElementPtrInst *value, bool decl = false);
void append(LoadInst *value, bool decl = false);
void append(StoreInst *value, bool decl = false);
void append(AtomicRMWInst *value, bool decl = false);
void append(AtomicCmpXchgInst *xchg, bool decl = false);
void append(ConstantAggregate *agg, bool decl = false);
void append(ConstantAggregateZero *zero, bool decl = false);
void append(ConstantDataArray *data, bool decl = false);
void append(ConstantDataVector *vec, bool decl = false);
void append(ConstantExpr *expr, bool decl = false);
void append(MDOperand *md);
void append(NamedMDNode *md);
void append(MDNode *md, bool decl = false);
void append(float v);
void append(double v);
void append(bool v);
void append(const char *str);
void newline();
void newline_noindent();
void begin_scope();
void end_scope();
template <typename T, typename... Ts>
void append(T &&t, Ts &&... ts)
{
append(std::forward<T>(t));
append(std::forward<Ts>(ts)...);
}
// Only want this overload to trigger on various integer types.
template <typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type append(T value)
{
stream << value;
}
// Need this to avoid the generic template to be deduced.
template <size_t N>
void append(char (&str)[N])
{
return append(static_cast<const char *>(str));
}
};
void StreamState::append(IntegerType *type)
{
append("i", type->getBitWidth());
}
void StreamState::append(StructType *type)
{
append("{ ");
for (unsigned i = 0; i < type->getNumElements(); i++)
{
append(type->getElementType(i));
if (i + 1 < type->getNumElements())
append(", ");
}
append(" }");
}
void StreamState::append(PointerType *type)
{
if (type->getAddressSpace() != 0)
append(type->getElementType(), " addrspace(", type->getAddressSpace(), ")*");
else
append(type->getElementType(), "*");
}
void StreamState::append(ArrayType *type)
{
append("[", type->getArrayNumElements(), " x ", type->getArrayElementType(), "]");
}
void StreamState::append(FunctionType *type)
{
append("(", type->getReturnType(), " (*) (");
for (unsigned i = 0; i < type->getNumParams(); i++)
{
append(type->getParamType(i));
if (i + 1 < type->getNumParams())
append(", ");
}
append("))");
}
void StreamState::append(VectorType *type)
{
append(type->getElementType(), "x", type->getVectorSize());
}
void StreamState::append(bool v)
{
stream << (v ? "true" : "false");
}
void StreamState::append(float v)
{
char buf[1024];
sprintf(buf, "%e", v);
append(buf);
}
void StreamState::append(double v)
{
char buf[1024];
sprintf(buf, "%e", v);
append(buf);
}
void StreamState::newline()
{
stream << "\n";
for (unsigned i = 0; i < indent; i++)
stream << " ";
}
void StreamState::newline_noindent()
{
stream << "\n";
}
void StreamState::append(const char *str)
{
stream << str;
}
void StreamState::append(const String &str)
{
stream << str;
}
void StreamState::begin_scope()
{
append(" {");
indent++;
}
void StreamState::end_scope()
{
assert(indent > 0);
indent--;
newline();
append("}");
}
void StreamState::append(Type *type)
{
switch (type->getTypeID())
{
case Type::TypeID::IntegerTyID:
return append(cast<IntegerType>(type));
case Type::TypeID::PointerTyID:
return append(cast<PointerType>(type));
case Type::TypeID::StructTyID:
return append(cast<StructType>(type));
case Type::TypeID::ArrayTyID:
return append(cast<ArrayType>(type));
case Type::TypeID::FunctionTyID:
return append(cast<FunctionType>(type));
case Type::TypeID::VectorTyID:
return append(cast<VectorType>(type));
case Type::TypeID::HalfTyID:
return append("half");
case Type::TypeID::FloatTyID:
return append("float");
case Type::TypeID::DoubleTyID:
return append("double");
case Type::TypeID::Unknown:
return append("unknown");
case Type::TypeID::VoidTyID:
return append("void");
case Type::TypeID::OpaqueTyID:
return append("opaque");
default:
break;
}
LOGE("Unknown Type %u.\n", unsigned(type->getTypeID()));
}
void StreamState::append(ShuffleVectorInst *shuf, bool decl)
{
if (decl)
{
append("%", shuf->get_tween_id(), " = shufflevector ", shuf->getType(), " ", shuf->getOperand(0), ", ", shuf->getOperand(1), " <");
auto *vec_type = cast<VectorType>(shuf->getType());
for (unsigned i = 0; i < vec_type->getVectorSize(); i++)
{
append(shuf->getMaskValue(i));
if (i + 1 < vec_type->getVectorSize())
append(", ");
}
append(">");
}
else
append("%", shuf->get_tween_id());
}
void StreamState::append(ExtractElementInst *extr, bool decl)
{
if (decl)
{
append("%", extr->get_tween_id(), " = extractelement ",
extr->getType(), " ", extr->getVectorOperand(), ", ", extr->getIndexOperand());
}
else
append("%", extr->get_tween_id());
}
void StreamState::append(InsertElementInst *inst, bool decl)
{
if (decl)
{
append("%", inst->get_tween_id(), " = insertelement ",
inst->getOperand(0), ", ", inst->getOperand(1), ", ", inst->getOperand(2));
}
else
append("%", inst->get_tween_id());
}
void StreamState::append(Argument *arg, bool decl)
{
append("%arg", arg->getArgNo());
}
void StreamState::append(Function *func, bool decl)
{
if (decl)
{
append("define ", func->getType(), " @", func->getName(), "(");
auto *type = func->getFunctionType();
for (unsigned i = 0; i < type->getNumParams(); i++)
{
append(type->getParamType(i));
if (i + 1 < type->getNumParams())
append(", ");
}
append(")");
if (func->begin() != func->end())
{
begin_scope();
for (auto &bb : *func)
append(&bb, true);
end_scope();
}
}
else
append("@", func->getName());
}
void StreamState::append(GlobalVariable *var, bool decl)
{
if (decl)
{
append("@", var->get_tween_id(), " = ");
if (cast<PointerType>(var->getType())->getAddressSpace() != 0)
append("groupshared ");
else
append(var->isConstant() ? "constant" : "global", " ");
append(var->getType()->getPointerElementType());
if (var->hasInitializer())
append(" ", var->getInitializer());
newline();
}
else
{
append("@", var->get_tween_id());
}
}
static const char *to_string(BinaryOperator::BinaryOps op)
{
switch (op)
{
#define BINOP(op, str) \
case BinaryOperator::BinaryOps::op: \
return str
BINOP(InvalidBinaryOp, "invalid");
BINOP(Add, "add");
BINOP(FAdd, "fadd");
BINOP(Sub, "sub");
BINOP(FSub, "fsub");
BINOP(Mul, "mul");
BINOP(FMul, "fmul");
BINOP(UDiv, "udiv");
BINOP(SDiv, "sdiv");
BINOP(FDiv, "fdiv");
BINOP(URem, "urem");
BINOP(SRem, "srem");
BINOP(FRem, "frem");
BINOP(Shl, "shl");
BINOP(LShr, "lshr");
BINOP(AShr, "ashr");
BINOP(And, "and");
BINOP(Or, "or");
BINOP(Xor, "xor");
}
#undef BINOP
return "???";
}
static const char *to_string(UnaryOperator::UnaryOps op)
{
switch (op)
{
case UnaryOperator::UnaryOps::FNeg:
return "fneg";
default:
return "invalid";
}
}
static const char *to_string(Instruction::Predicate pred)
{
switch (pred)
{
#define PRED(op, str) \
case Instruction::FCMP_##op: \
return str
PRED(FALSE, "false");
PRED(OEQ, "oeq");
PRED(OGT, "ogt");
PRED(OGE, "oge");
PRED(OLT, "olt");
PRED(OLE, "ole");
PRED(ONE, "one");
PRED(ORD, "ord");
PRED(UNO, "uno");
PRED(UEQ, "ueq");
PRED(UGT, "ugt");
PRED(UGE, "uge");
PRED(ULT, "ult");
PRED(ULE, "ule");
PRED(UNE, "une");
PRED(TRUE, "true");
#undef PRED
#define PRED(op, str) \
case Instruction::ICMP_##op: \
return str
PRED(EQ, "eq");
PRED(NE, "ne");
PRED(UGT, "ugt");
PRED(UGE, "uge");
PRED(ULT, "ult");
PRED(ULE, "ule");
PRED(SGT, "sgt");
PRED(SGE, "sge");
PRED(SLT, "slt");
PRED(SLE, "sle");
}
#undef PRED
return "???";
}
static const char *to_string(Instruction::CastOps op)
{
switch (op)
{
#define CAST(op, str) \
case Instruction::op: \
return str
CAST(Trunc, "trunc");
CAST(ZExt, "zext");
CAST(SExt, "sext");
CAST(FPToUI, "fptoui");
CAST(FPToSI, "fptosi");
CAST(UIToFP, "uitofp");
CAST(SIToFP, "sitofp");
CAST(FPTrunc, "fptrunc");
CAST(FPExt, "fpext");
CAST(PtrToInt, "ptrtoint");
CAST(IntToPtr, "inttoptr");
CAST(BitCast, "bitcast");
CAST(AddrSpaceCast, "addrspacecast");
default:
break;
}
#undef CAST
return "???";
}
static const char *to_string(AtomicRMWInst::BinOp op)
{
switch (op)
{
#define RMW(op, str) \
case AtomicRMWInst::BinOp::op: \
return str
RMW(Add, "add");
RMW(Sub, "sub");
RMW(Xchg, "xchg");
RMW(And, "and");
RMW(Xor, "xor");
RMW(Or, "or");
RMW(Nand, "nand");
RMW(Max, "max");
RMW(Min, "min");
RMW(UMax, "umax");
RMW(UMin, "umin");
RMW(FAdd, "fadd");
RMW(FSub, "fsub");
default:
break;
}
#undef RMW
return "???";
}
void StreamState::append(BinaryOperator *binop, bool decl)
{
if (decl)
{
append("%", binop->get_tween_id(), " = ", to_string(binop->getOpcode()), " ", binop->getType(), " ",
binop->getOperand(0), ", ", binop->getOperand(1));
}
else
{
append("%", binop->get_tween_id());
}
}
void StreamState::append(UnaryOperator *uop, bool decl)
{
if (decl)
{
append("%", uop->get_tween_id(), " = ", to_string(uop->getOpcode()), " ", uop->getType(), " ",
uop->getOperand(0), ", ", uop->getOperand(1));
}
else
{
append("%", uop->get_tween_id());
}
}
void StreamState::append(BasicBlock *bb, bool decl)
{
if (decl)
{
newline_noindent();
newline_noindent();
append(bb->get_tween_id(), ":");
for (auto &inst : *bb)
{
newline();
append(&inst);
}
}
else
{
append("label %", bb->get_tween_id());
}
}
void StreamState::append(FCmpInst *value, bool decl)
{
if (decl)
{
append("%", value->get_tween_id(), " = fcmp ", to_string(value->getPredicate()), " ", value->getOperand(0),
", ", value->getOperand(1));
}
else
{
append("%", value->get_tween_id());
}
}
void StreamState::append(ICmpInst *value, bool decl)
{
if (decl)
{
append("%", value->get_tween_id(), " = icmp ", to_string(value->getPredicate()), " ", value->getOperand(0),
", ", value->getOperand(1));
}
else
{
append("%", value->get_tween_id());
}
}
void StreamState::append(BranchInst *br, bool)
{
append("br ");
if (br->getCondition())
append(br->getCondition(), ", ", br->getSuccessor(0), ", ", br->getSuccessor(1));
else
append(br->getSuccessor(0));
}
void StreamState::append(SwitchInst *branch, bool)
{
append("switch ", branch->getCondition(), ", ", branch->getDefaultDest());
begin_scope();
for (auto itr = branch->case_begin(); itr != branch->case_end(); ++itr)
{
newline();
append(itr->getCaseValue(), ", ", itr->getCaseSuccessor());
}
end_scope();
}
void StreamState::append(CallInst *call, bool decl)
{
if (decl)
{
if (call->getType()->getTypeID() != Type::TypeID::VoidTyID)
append("%", call->get_tween_id(), " = ");
append("call ", call->getType(), " @", call->getCalledFunction()->getName(), "(");
for (unsigned i = 0; i < call->getNumOperands(); i++)
{
append(call->getOperand(i));
if (i + 1 < call->getNumOperands())
append(", ");
}
append(")");
for (auto itr = call->metadata_begin(); itr != call->metadata_end(); ++itr)
{
append(" !", itr->first, " ", itr->second);
}
}
else
{
append("%", call->get_tween_id());
}
}
void StreamState::append(CastInst *cast, bool decl)
{
if (decl)
{
append("%", cast->get_tween_id(), " = ", to_string(cast->getOpcode()), " ", cast->getOperand(0), " to ",
cast->getType());
}
else
{
append("%", cast->get_tween_id());
}
}
void StreamState::append(SelectInst *cast, bool decl)
{
if (decl)
{
append("%", cast->get_tween_id(), " = ", "select ", cast->getOperand(0), ", ", cast->getOperand(1), ", ",
cast->getOperand(2));
}
else
{
append("%", cast->get_tween_id());
}
}
void StreamState::append(ExtractValueInst *ext, bool decl)
{
if (decl)
{
append("%", ext->get_tween_id(), " = ", "extractvalue ", ext->getType(), " ", ext->getAggregateOperand());
for (unsigned i = 0; i < ext->getNumIndices(); i++)
{
append(", ");
append(ext->getIndices()[i]);
}
}
else
{
append("%", ext->get_tween_id());
}
}
void StreamState::append(AllocaInst *alloca, bool decl)
{
if (decl)
{
append("%", alloca->get_tween_id(), " = alloca ", cast<PointerType>(alloca->getType())->getElementType());
}
else
{
append("%", alloca->get_tween_id());
}
}
void StreamState::append(GetElementPtrInst *ptr, bool decl)
{
if (decl)
{
append("%", ptr->get_tween_id(), " = getelementptr ", ptr->isInBounds() ? "inbounds " : "", ptr->getType());
for (unsigned i = 0; i < ptr->getNumOperands(); i++)
{
append(", ");
append(ptr->getOperand(i));
}
}
else
{
append("%", ptr->get_tween_id());
}
}
void StreamState::append(LoadInst *ptr, bool decl)
{
if (decl)
append("%", ptr->get_tween_id(), " = load ", ptr->getType(), " ", ptr->getPointerOperand());
else
append("%", ptr->get_tween_id());
}
void StreamState::append(StoreInst *ptr, bool decl)
{
if (decl)
append("store ", ptr->getOperand(0), ", ", ptr->getOperand(1));
else
append("%", ptr->get_tween_id());
}
void StreamState::append(AtomicRMWInst *atomic_op, bool decl)
{
if (decl)
{
append("%", atomic_op->get_tween_id(), " = atomicrmw ", to_string(atomic_op->getOperation()), " ",
atomic_op->getType(), " ", atomic_op->getPointerOperand(), ", ", atomic_op->getValOperand());
}
else
append("%", atomic_op->get_tween_id());
}
void StreamState::append(AtomicCmpXchgInst *xchg, bool decl)
{
if (decl)
{
append("%", xchg->get_tween_id(), " = cmpxchg ", xchg->getType(), " ", xchg->getPointerOperand(), ", ",
xchg->getCompareOperand(), ", ", xchg->getNewValOperand());
}
else
append("%", xchg->get_tween_id());
}
void StreamState::append(ConstantAggregate *agg, bool)
{
append("[");
if (agg->getNumOperands())
append(agg->getOperand(0));
for (unsigned i = 1; i < agg->getNumOperands(); i++)
append(", ", agg->getOperand(i));
append("]");
}
void StreamState::append(ConstantAggregateZero *zero, bool)
{
append("[zeroinitialized]");
}
void StreamState::append(ConstantDataArray *arr, bool)
{
append("[");
for (unsigned i = 0; i < arr->getNumElements(); i++)
{
append(arr->getElementAsConstant(i));
if (i + 1 < arr->getNumElements())
append(", ");
}
append("]");
}
void StreamState::append(ConstantDataVector *vec, bool)
{
append("<");
for (unsigned i = 0; i < vec->getNumElements(); i++)
{
append(vec->getElementAsConstant(i));
if (i + 1 < vec->getNumElements())
append(", ");
}
append(">");
}
void StreamState::append(ConstantExpr *expr, bool decl)
{
if (decl)
{
append("%", expr->get_tween_id(), " = ", expr->getOpcode(), " ", expr->getType());
if (expr->getNumOperands())
append(" ", expr->getOperand(0));
for (unsigned i = 1; i < expr->getNumOperands(); i++)
append(", ", expr->getOperand(i));
}
else
{
append("%", expr->get_tween_id());
}
}
void StreamState::append(PHINode *phi, bool decl)
{
if (decl)
{
append("%", phi->get_tween_id(), " = phi ", phi->getType(), " ");
unsigned count = phi->getNumIncomingValues();
for (unsigned i = 0; i < count; i++)
{
Value *value = phi->getIncomingValue(i);
BasicBlock *bb = phi->getIncomingBlock(i);
append("[ ", value, ", ", bb, " ]");
if (i + 1 < count)
append(", ");
}
}
else
{
append("%", phi->get_tween_id());
}
}
void StreamState::append(ReturnInst *value, bool)
{
if (value->getReturnValue())
append("ret ", value);
else
append("ret void");
}
void StreamState::append(UndefValue *undef, bool decl)
{
append(undef->getType(), " undef");
}
void StreamState::append(ConstantFP *value, bool decl)
{
append(value->getValueAPF().convertToDouble());
}
void StreamState::append(ConstantInt *value, bool decl)
{
append(value->getType(), " ", value->getUniqueInteger().getSExtValue());
}
void StreamState::append(Constant *value, bool decl)
{
append(static_cast<Value *>(value), decl);
}
void StreamState::append(Instruction *inst)
{
append(static_cast<Value *>(inst), true);
}
void StreamState::append(MDNode *md, bool decl)
{
if (md)
{
if (decl)
{
append("!", md->get_tween_id(), " = !{");
for (unsigned i = 0; i < md->getNumOperands(); i++)
{
append(&md->getOperand(i));
if (i + 1 < md->getNumOperands())
append(", ");
}
append("}");
}
else
append("!", md->get_tween_id());
}
else
append("null");
}
void StreamState::append(NamedMDNode *md)
{
append("!", md->getName(), " = !{");
for (unsigned i = 0; i < md->getNumOperands(); i++)
{
append(md->getOperand(i), false);
if (i + 1 < md->getNumOperands())
append(", ");
}
append("}");
}
void StreamState::append(MDOperand *md)
{
if (md)
{
switch (md->get_metadata_kind())
{
case MetadataKind::NamedNode:
return append(cast<NamedMDNode>(md));
case MetadataKind::Node:
return append(cast<MDNode>(md), false);
case MetadataKind::Constant:
return append(cast<ConstantAsMetadata>(md)->getValue());
case MetadataKind::String:
return append("\"", cast<MDString>(md)->getString(), "\"");
case MetadataKind::None:
return append("null");
default:
LOGE("Unknown MetadataKind %u.\n", unsigned(md->get_metadata_kind()));
break;
}
}
else
append("null");
}
void StreamState::append(Value *value, bool decl)
{
switch (value->get_value_kind())
{
case ValueKind::Argument:
return append(cast<Argument>(value), decl);
case ValueKind::Function:
return append(cast<Function>(value), decl);
case ValueKind::BinaryOperator:
return append(cast<BinaryOperator>(value), decl);
case ValueKind::UnaryOperator:
return append(cast<UnaryOperator>(value), decl);
case ValueKind::Call:
return append(cast<CallInst>(value), decl);
case ValueKind::Branch:
return append(cast<BranchInst>(value), decl);
case ValueKind::FCmp:
return append(cast<FCmpInst>(value), decl);
case ValueKind::ICmp:
return append(cast<ICmpInst>(value), decl);
case ValueKind::Return:
return append(cast<ReturnInst>(value), decl);
case ValueKind::Undef:
return append(cast<UndefValue>(value), decl);
case ValueKind::ConstantInt:
return append(cast<ConstantInt>(value), decl);
case ValueKind::ConstantFP:
return append(cast<ConstantFP>(value), decl);
case ValueKind::BasicBlock:
return append(cast<BasicBlock>(value), decl);
case ValueKind::PHI:
return append(cast<PHINode>(value), decl);
case ValueKind::Cast:
return append(cast<CastInst>(value), decl);
case ValueKind::Select:
return append(cast<SelectInst>(value), decl);
case ValueKind::ExtractValue:
return append(cast<ExtractValueInst>(value), decl);
case ValueKind::Alloca:
return append(cast<AllocaInst>(value), decl);
case ValueKind::GetElementPtr:
return append(cast<GetElementPtrInst>(value), decl);
case ValueKind::Load:
return append(cast<LoadInst>(value), decl);
case ValueKind::Store:
return append(cast<StoreInst>(value), decl);
case ValueKind::AtomicRMW:
return append(cast<AtomicRMWInst>(value), decl);
case ValueKind::AtomicCmpXchg:
return append(cast<AtomicCmpXchgInst>(value), decl);
case ValueKind::Global:
return append(cast<GlobalVariable>(value), decl);
case ValueKind::ConstantAggregate:
return append(cast<ConstantAggregate>(value), decl);
case ValueKind::ConstantAggregateZero:
return append(cast<ConstantAggregateZero>(value), decl);
case ValueKind::ConstantDataArray:
return append(cast<ConstantDataArray>(value), decl);
case ValueKind::ConstantDataVector:
return append(cast<ConstantDataVector>(value), decl);
case ValueKind::ConstantExpr:
return append(cast<ConstantExpr>(value), decl);
case ValueKind::Switch:
return append(cast<SwitchInst>(value), decl);
case ValueKind::ShuffleVector:
return append(cast<ShuffleVectorInst>(value), decl);
case ValueKind::ExtractElement:
return append(cast<ExtractElementInst>(value), decl);
case ValueKind::InsertElement:
return append(cast<InsertElementInst>(value), decl);
default:
break;
}
LOGE("Unknown ValueKind %u.\n", unsigned(value->get_value_kind()));
if (decl)
append("%", value->get_tween_id(), " = unimplemented");
else
append("%", value->get_tween_id());
}
bool disassemble(Module &module, String &str)
{
StreamState state;
for (auto itr = module.global_begin(); itr != module.global_end(); ++itr)
state.append(&*itr, true);
for (auto *func : module)
{
state.newline();
state.append(func, true);
state.newline();
}
state.newline();
for (auto itr = module.named_metadata_begin(); itr != module.named_metadata_end(); ++itr)
{
state.newline();
state.append(itr->second);
}
state.newline();
for (auto itr = module.unnamed_metadata_begin(); itr != module.unnamed_metadata_end(); ++itr)
{
state.newline();
state.append(*itr, true);
}
str = state.stream.str();
return true;
}
} // namespace LLVMBC
================================================
FILE: bc/function.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "function.hpp"
#include "context.hpp"
#include "instruction.hpp"
#include "module.hpp"
#include "type.hpp"
#include <algorithm>
#include <assert.h>
namespace LLVMBC
{
Function::Function(FunctionType *function_type_, uint64_t value_id_, Module &module_)
: Constant(function_type_, ValueKind::Function)
, module(module_)
, value_id(value_id_)
, function_type(function_type_)
{
}
const String &Function::getName() const
{
return module.get_value_name(value_id);
}
void Function::set_basic_blocks(Vector<BasicBlock *> basic_blocks_)
{
basic_blocks = std::move(basic_blocks_);
}
FunctionType *Function::getFunctionType() const
{
return function_type;
}
IteratorAdaptor<BasicBlock, Vector<BasicBlock *>::const_iterator> Function::begin() const
{
return basic_blocks.begin();
}
IteratorAdaptor<BasicBlock, Vector<BasicBlock *>::const_iterator> Function::end() const
{
return basic_blocks.end();
}
BasicBlock &Function::getEntryBlock() const
{
return *basic_blocks.front();
}
void Function::add_argument(Argument *arg)
{
arguments.push_back(arg);
}
String Attribute::getValueAsString() const
{
// LLVM implementation does this.
if (value)
return *value;
else
return {};
}
Attribute::Attribute(const String *value_)
: value(value_)
{
}
Attribute Function::getFnAttribute(const char *attribute) const
{
for (auto &attr : attributes)
if (attr.first == attribute)
return Attribute(&attr.second);
return Attribute(nullptr);
}
bool Function::hasFnAttribute(const char *attribute) const
{
for (auto &attr : attributes)
if (attr.first == attribute)
return true;
return false;
}
void Function::set_attributes(Vector<std::pair<String, String>> attributes_)
{
attributes = std::move(attributes_);
}
void Function::set_structured_control_flow()
{
structured_control_flow = true;
}
bool Function::get_structured_control_flow() const
{
return structured_control_flow;
}
IteratorAdaptor<const Argument, Vector<Argument *>::const_iterator> Function::arg_begin() const
{
return arguments.begin();
}
IteratorAdaptor<const Argument, Vector<Argument *>::const_iterator> Function::arg_end() const
{
return arguments.end();
}
BasicBlock::BasicBlock(LLVMContext &context_)
: Value(Type::getLabelTy(context_), ValueKind::BasicBlock)
{
}
void BasicBlock::add_instruction(Instruction *inst)
{
instructions.push_back(inst);
}
Instruction *BasicBlock::getTerminator() const
{
if (!instructions.empty() && instructions.back()->isTerminator())
return instructions.back();
else
return nullptr;
}
void BasicBlock::add_successor(BasicBlock *succ)
{
if (std::find(succs.begin(), succs.end(), succ) == succs.end())
succs.push_back(succ);
}
BasicBlock::Merge BasicBlock::get_merge() const
{
return merge;
}
BasicBlock *BasicBlock::get_merge_bb() const
{
return merge_bb;
}
BasicBlock *BasicBlock::get_continue_bb() const
{
return continue_bb;
}
void BasicBlock::set_selection_merge(BasicBlock *bb)
{
merge = Merge::Selection;
merge_bb = bb;
}
void BasicBlock::set_loop_merge(BasicBlock *merge_bb_, BasicBlock *continue_bb_)
{
merge = Merge::Loop;
merge_bb = merge_bb_;
continue_bb = continue_bb_;
}
IteratorAdaptor<Instruction, Vector<Instruction *>::const_iterator> BasicBlock::begin() const
{
return instructions.begin();
}
IteratorAdaptor<Instruction, Vector<Instruction *>::const_iterator> BasicBlock::end() const
{
return instructions.end();
}
Vector<BasicBlock *>::const_iterator BasicBlock::succ_begin() const
{
return succs.begin();
}
Vector<BasicBlock *>::const_iterator BasicBlock::succ_end() const
{
return succs.end();
}
} // namespace LLVMBC
================================================
FILE: bc/function.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "iterator.hpp"
#include "value.hpp"
namespace LLVMBC
{
class LLVMContext;
class Instruction;
class Module;
class FunctionType;
class BasicBlock : public Value
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::BasicBlock;
}
explicit BasicBlock(LLVMContext &context);
void add_instruction(Instruction *inst);
Instruction *getTerminator() const;
IteratorAdaptor<Instruction, Vector<Instruction *>::const_iterator> begin() const;
IteratorAdaptor<Instruction, Vector<Instruction *>::const_iterator> end() const;
void add_successor(BasicBlock *succ);
enum class Merge
{
None,
Selection,
Loop
};
Merge get_merge() const;
void set_selection_merge(BasicBlock *bb);
void set_loop_merge(BasicBlock *merge_bb, BasicBlock *continue_bb);
BasicBlock *get_merge_bb() const;
BasicBlock *get_continue_bb() const;
Vector<BasicBlock *>::const_iterator succ_begin() const;
Vector<BasicBlock *>::const_iterator succ_end() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Vector<Instruction *> instructions;
Vector<BasicBlock *> succs;
Merge merge = Merge::None;
BasicBlock *merge_bb = nullptr;
BasicBlock *continue_bb = nullptr;
};
inline Vector<BasicBlock *>::const_iterator succ_begin(const BasicBlock *bb)
{
return bb->succ_begin();
}
inline Vector<BasicBlock *>::const_iterator succ_end(const BasicBlock *bb)
{
return bb->succ_end();
}
class Attribute
{
public:
explicit Attribute(const String *value);
String getValueAsString() const;
private:
const String *value;
};
class Function : public Constant
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Function;
}
explicit Function(FunctionType *function_type, uint64_t value_id, Module &module);
const String &getName() const;
void set_basic_blocks(Vector<BasicBlock *> basic_blocks);
IteratorAdaptor<BasicBlock, Vector<BasicBlock *>::const_iterator> begin() const;
IteratorAdaptor<BasicBlock, Vector<BasicBlock *>::const_iterator> end() const;
FunctionType *getFunctionType() const;
BasicBlock &getEntryBlock() const;
void add_argument(Argument *arg);
IteratorAdaptor<const Argument, Vector<Argument *>::const_iterator> arg_begin() const;
IteratorAdaptor<const Argument, Vector<Argument *>::const_iterator> arg_end() const;
// Bare bones implementation, we only need it for fp32-denorm-mode attribute.
Attribute getFnAttribute(const char *attribute) const;
bool hasFnAttribute(const char *attribute) const;
void set_attributes(Vector<std::pair<String, String>> attributes);
bool get_structured_control_flow() const;
void set_structured_control_flow();
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Module &module;
uint64_t value_id;
FunctionType *function_type;
Vector<BasicBlock *> basic_blocks;
Vector<Argument *> arguments;
Vector<std::pair<String, String>> attributes;
bool structured_control_flow = false;
};
} // namespace LLVMBC
================================================
FILE: bc/instruction.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "instruction.hpp"
#include "cast.hpp"
#include <assert.h>
namespace LLVMBC
{
Instruction::Instruction(Type *type, ValueKind kind)
: Value(type, kind)
{
}
void Instruction::set_operands(Vector<Value *> op)
{
operands = std::move(op);
}
unsigned Instruction::getNumOperands() const
{
return operands.size();
}
Value *Instruction::getOperand(unsigned index) const
{
if (index >= operands.size())
{
LOGE("Operand index is out of range.\n");
return nullptr;
}
return Internal::resolve_proxy(operands[index]);
}
bool Instruction::isTerminator() const
{
return is_terminator;
}
void Instruction::set_terminator()
{
is_terminator = true;
}
bool Instruction::resolve_proxy_values()
{
for (auto &op : operands)
while (op && op->get_value_kind() == ValueKind::Proxy)
op = cast<ValueProxy>(op)->get_proxy_value();
if (get_value_kind() == ValueKind::PHI)
{
auto *phi = cast<PHINode>(this);
if (!phi->resolve_proxy_values_incoming())
return false;
}
return true;
}
void Instruction::setMetadata(const String &str, MDNode *node)
{
attachments[str] = node;
}
UnorderedMap<String, MDNode *>::const_iterator Instruction::metadata_begin() const
{
return attachments.begin();
}
UnorderedMap<String, MDNode *>::const_iterator Instruction::metadata_end() const
{
return attachments.end();
}
bool Instruction::hasMetadata(const String &str) const
{
return attachments.find(str) != attachments.end();
}
MDNode *Instruction::getMetadata(const String &str) const
{
auto itr = attachments.find(str);
if (itr != attachments.end())
return itr->second;
else
return nullptr;
}
bool Instruction::is_base_of_value_kind(ValueKind kind)
{
switch (kind)
{
case ValueKind::Return:
case ValueKind::Unreachable:
case ValueKind::Call:
case ValueKind::UnaryOperator:
case ValueKind::BinaryOperator:
case ValueKind::Cast:
case ValueKind::Select:
case ValueKind::ExtractValue:
case ValueKind::Alloca:
case ValueKind::GetElementPtr:
case ValueKind::Load:
case ValueKind::Store:
case ValueKind::CompareBase:
case ValueKind::FCmp:
case ValueKind::ICmp:
case ValueKind::Branch:
case ValueKind::Switch:
case ValueKind::PHI:
case ValueKind::AtomicRMW:
case ValueKind::AtomicCmpXchg:
case ValueKind::ShuffleVector:
case ValueKind::ExtractElement:
case ValueKind::InsertElement:
return true;
default:
break;
}
return false;
}
BinaryOperator::BinaryOperator(Value *LHS, Value *RHS, BinaryOps op_)
: Instruction(LHS->getType(), ValueKind::BinaryOperator)
, op(op_)
{
set_operands({ LHS, RHS });
}
BinaryOperator::BinaryOps BinaryOperator::getOpcode() const
{
return op;
}
bool BinaryOperator::isFast() const
{
return fast_math;
}
void BinaryOperator::setFast(bool enabled)
{
fast_math = enabled;
}
UnaryOperator::UnaryOperator(UnaryOps uop, Value *value)
: Instruction(value->getType(), ValueKind::UnaryOperator), op(uop)
{
set_operands({ value });
}
UnaryOperator::UnaryOps UnaryOperator::getOpcode() const
{
return op;
}
ReturnInst::ReturnInst(Value *value_)
: Instruction(value_ ? value_->getType() : nullptr, ValueKind::Return)
, value(value_)
{
set_terminator();
}
UnreachableInst::UnreachableInst()
: Instruction(nullptr, ValueKind::Unreachable)
{
set_terminator();
}
CallInst::CallInst(FunctionType *function_type_, Function *callee_, Vector<Value *> params)
: Instruction(function_type_->getReturnType(), ValueKind::Call)
, callee(callee_)
{
set_operands(std::move(params));
}
Function *CallInst::getCalledFunction() const
{
return callee;
}
Value *ReturnInst::getReturnValue() const
{
return Internal::resolve_proxy(value);
}
CmpInst::CmpInst(ValueKind kind, Predicate pred_, Value *LHS, Value *RHS)
: Instruction(Type::getInt1Ty(LHS->getType()->getContext()), kind)
, pred(pred_)
{
set_operands({ LHS, RHS });
}
CastInst::CastInst(Type *type, Value *value, Instruction::CastOps op_)
: Instruction(type, ValueKind::Cast)
, op(op_)
{
set_operands({ value });
}
SelectInst::SelectInst(Value *true_value, Value *false_value, Value *cond)
: Instruction(true_value->getType(), ValueKind::Select)
{
set_operands({ cond, true_value, false_value });
}
ExtractValueInst::ExtractValueInst(Type *type, Value *aggregate, Vector<unsigned> indices_)
: Instruction(type, ValueKind::ExtractValue)
, indices(std::move(indices_))
{
set_operands({ aggregate });
}
Value *ExtractValueInst::getAggregateOperand() const
{
return Internal::resolve_proxy(operands[0]);
}
unsigned ExtractValueInst::getNumIndices() const
{
return indices.size();
}
const unsigned *ExtractValueInst::getIndices() const
{
return indices.data();
}
Instruction::CastOps CastInst::getOpcode() const
{
return op;
}
Instruction::Predicate CmpInst::getPredicate() const
{
return pred;
}
bool CmpInst::is_base_of_value_kind(ValueKind kind)
{
return kind == ValueKind::ICmp || kind == ValueKind::FCmp;
}
FCmpInst::FCmpInst(Predicate pred_, Value *LHS, Value *RHS)
: CmpInst(ValueKind::FCmp, pred_, LHS, RHS)
{
set_operands({ LHS, RHS });
}
ICmpInst::ICmpInst(Predicate pred_, Value *LHS, Value *RHS)
: CmpInst(ValueKind::ICmp, pred_, LHS, RHS)
{
set_operands({ LHS, RHS });
}
BranchInst::BranchInst(BasicBlock *true_block, BasicBlock *false_block, Value *cond_)
: Instruction(nullptr, ValueKind::Branch)
, cond(cond_)
{
set_terminator();
num_blocks = 2;
bbs[0] = true_block;
bbs[1] = false_block;
}
BranchInst::BranchInst(BasicBlock *true_block)
: Instruction(nullptr, ValueKind::Branch)
{
set_terminator();
num_blocks = 1;
bbs[0] = true_block;
}
bool BranchInst::isConditional() const
{
return cond != nullptr;
}
Value *BranchInst::getCondition() const
{
return Internal::resolve_proxy(cond);
}
BasicBlock *BranchInst::getSuccessor(unsigned index) const
{
assert(index < num_blocks);
return bbs[index];
}
unsigned BranchInst::getNumSuccessors() const
{
return num_blocks;
}
SwitchInst::SwitchInst(Value *cond_, BasicBlock *default_block_, unsigned num_cases)
: Instruction(Type::getVoidTy(cond_->getType()->getContext()), ValueKind::Switch)
, cond(cond_)
, default_block(default_block_)
{
set_terminator();
cases.reserve(num_cases);
}
void SwitchInst::addCase(Value *case_value, BasicBlock *bb)
{
cases.push_back({ case_value, bb });
}
Vector<SwitchInst::Case>::const_iterator SwitchInst::case_begin() const
{
return cases.begin();
}
Vector<SwitchInst::Case>::const_iterator SwitchInst::case_end() const
{
return cases.end();
}
BasicBlock *SwitchInst::getDefaultDest() const
{
return default_block;
}
Value *SwitchInst::getCondition() const
{
return Internal::resolve_proxy(cond);
}
ConstantInt *SwitchInst::Case::getCaseValue() const
{
return cast<ConstantInt>(value);
}
BasicBlock *SwitchInst::Case::getCaseSuccessor() const
{
return bb;
}
PHINode::PHINode(Type *type, size_t num_edges)
: Instruction(type, ValueKind::PHI)
{
incoming.reserve(num_edges);
}
void PHINode::add_incoming(Value *value, BasicBlock *bb)
{
incoming.push_back({ value, bb });
}
unsigned PHINode::getNumIncomingValues() const
{
return unsigned(incoming.size());
}
AllocaInst::AllocaInst(Type *pointer_type, Type *element_type_, Value *size)
: Instruction(pointer_type, ValueKind::Alloca)
, array_size(size)
{
}
Value *AllocaInst::getArraySize() const
{
return Internal::resolve_proxy(array_size);
}
GetElementPtrInst::GetElementPtrInst(Type *pointer_type, Vector<Value *> indices, bool inbounds_)
: Instruction(pointer_type, ValueKind::GetElementPtr)
, inbounds(inbounds_)
{
set_operands(std::move(indices));
}
bool GetElementPtrInst::isInBounds() const
{
return inbounds;
}
LoadInst::LoadInst(Type *type, Value *ptr)
: Instruction(type, ValueKind::Load)
{
set_operands({ ptr });
}
Value *LoadInst::getPointerOperand() const
{
return getOperand(0);
}
StoreInst::StoreInst(Value *ptr, Value *value)
: Instruction(Type::getVoidTy(ptr->getType()->getContext()), ValueKind::Store)
{
set_operands({ value, ptr });
}
BasicBlock *PHINode::getIncomingBlock(unsigned index) const
{
if (index >= incoming.size())
return nullptr;
return incoming[index].bb;
}
Value *PHINode::getIncomingValue(unsigned index) const
{
if (index >= incoming.size())
return nullptr;
return Internal::resolve_proxy(incoming[index].value);
}
bool PHINode::resolve_proxy_values_incoming()
{
for (auto &node : incoming)
{
while (node.value && node.value->get_value_kind() == ValueKind::Proxy)
{
node.value = cast<ValueProxy>(node.value)->get_proxy_value();
if (!node.value)
return false;
}
}
return true;
}
AtomicRMWInst::AtomicRMWInst(Type *type, Value *ptr_, Value *value_, BinOp op_)
: Instruction(type, ValueKind::AtomicRMW)
, ptr(ptr_)
, value(value_)
, op(op_)
{
set_operands({ ptr, value });
}
Value *AtomicRMWInst::getPointerOperand() const
{
return Internal::resolve_proxy(ptr);
}
Value *AtomicRMWInst::getValOperand() const
{
return Internal::resolve_proxy(value);
}
AtomicRMWInst::BinOp AtomicRMWInst::getOperation() const
{
return op;
}
AtomicCmpXchgInst::AtomicCmpXchgInst(Value *ptr_, Value *cmp_, Value *new_value_, Type *type_override)
: Instruction(type_override ?
type_override :
StructType::get(new_value_->getType()->getContext(),
{ new_value_->getType(), Type::getInt1Ty(new_value_->getType()->getContext()) }),
ValueKind::AtomicCmpXchg)
, ptr(ptr_)
, new_value(new_value_)
, cmp_value(cmp_)
{
set_operands({ ptr, new_value, cmp_value });
}
Value *AtomicCmpXchgInst::getPointerOperand() const
{
return Internal::resolve_proxy(ptr);
}
Value *AtomicCmpXchgInst::getCompareOperand() const
{
return Internal::resolve_proxy(cmp_value);
}
Value *AtomicCmpXchgInst::getNewValOperand() const
{
return Internal::resolve_proxy(new_value);
}
ShuffleVectorInst::ShuffleVectorInst(Type *type, Value *a, Value *b, Value *shuf)
: Instruction(type, ValueKind::ShuffleVector)
{
set_operands({ a, b });
auto *masks = cast<ConstantDataVector>(shuf);
shuffle_mask.reserve(masks->getNumElements());
for (unsigned i = 0; i < masks->getNumElements(); i++)
shuffle_mask.push_back(cast<ConstantInt>(masks->getElementAsConstant(i))->getUniqueInteger().getSExtValue());
}
int ShuffleVectorInst::getMaskValue(unsigned index) const
{
assert(index < shuffle_mask.size());
return shuffle_mask[index];
}
ExtractElementInst::ExtractElementInst(Value *vec_, Value *index_)
: Instruction(cast<VectorType>(vec_->getType())->getElementType(), ValueKind::ExtractElement),
vec(vec_), index(index_)
{
set_operands({ vec, index });
}
Value *ExtractElementInst::getVectorOperand() const
{
return Internal::resolve_proxy(vec);
}
Value *ExtractElementInst::getIndexOperand() const
{
return Internal::resolve_proxy(index);
}
InsertElementInst::InsertElementInst(Value *vec, Value *value, Value *index)
: Instruction(vec->getType(), ValueKind::InsertElement)
{
set_operands({ vec, value, index });
}
CompositeConstructInst::CompositeConstructInst(Type *type, Vector<Value *> constituents)
: Instruction(type, ValueKind::CompositeConstruct)
{
set_operands(std::move(constituents));
}
} // namespace LLVMBC
================================================
FILE: bc/instruction.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "value.hpp"
namespace LLVMBC
{
class FunctionType;
class Function;
class BasicBlock;
class MDNode;
class Instruction : public Value
{
public:
Instruction(Type *type, ValueKind kind);
enum Predicate
{
FCMP_FALSE = 0,
FCMP_OEQ = 1,
FCMP_OGT = 2,
FCMP_OGE = 3,
FCMP_OLT = 4,
FCMP_OLE = 5,
FCMP_ONE = 6,
FCMP_ORD = 7,
FCMP_UNO = 8,
FCMP_UEQ = 9,
FCMP_UGT = 10,
FCMP_UGE = 11,
FCMP_ULT = 12,
FCMP_ULE = 13,
FCMP_UNE = 14,
FCMP_TRUE = 15,
ICMP_EQ = 32,
ICMP_NE = 33,
ICMP_UGT = 34,
ICMP_UGE = 35,
ICMP_ULT = 36,
ICMP_ULE = 37,
ICMP_SGT = 38,
ICMP_SGE = 39,
ICMP_SLT = 40,
ICMP_SLE = 41
};
enum CastOps
{
InvalidCastOp = 100,
Trunc,
ZExt,
SExt,
FPToUI,
FPToSI,
UIToFP,
SIToFP,
FPTrunc,
FPExt,
PtrToInt,
IntToPtr,
BitCast,
AddrSpaceCast
};
enum GEPOps
{
GetElementPtr = 200
};
enum BinaryOps
{
InvalidBinaryOp = 300,
Add,
FAdd,
Sub,
FSub,
Mul,
FMul,
UDiv,
SDiv,
FDiv,
URem,
SRem,
FRem,
Shl,
LShr,
AShr,
And,
Or,
Xor
};
bool isTerminator() const;
Value *getOperand(unsigned index) const;
unsigned getNumOperands() const;
bool resolve_proxy_values();
MDNode *getMetadata(const String &str) const;
bool hasMetadata(const String &str) const;
void setMetadata(const String &str, MDNode *node);
UnorderedMap<String, MDNode *>::const_iterator metadata_begin() const;
UnorderedMap<String, MDNode *>::const_iterator metadata_end() const;
static bool is_base_of_value_kind(ValueKind kind);
static constexpr ValueKind get_value_kind()
{
return ValueKind::InstructionBase;
}
protected:
void set_terminator();
bool is_terminator = false;
void set_operands(Vector<Value *> op);
Vector<Value *> operands;
UnorderedMap<String, MDNode *> attachments;
};
class ReturnInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Return;
}
explicit ReturnInst(Value *value);
Value *getReturnValue() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *value;
};
class UnreachableInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Unreachable;
}
UnreachableInst();
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class CallInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Call;
}
CallInst(FunctionType *function_type, Function *callee, Vector<Value *> params);
Function *getCalledFunction() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Function *callee;
};
class UnaryOperator : public Instruction
{
public:
enum class UnaryOps
{
Invalid,
FNeg,
INeg, // custom extension
};
static constexpr ValueKind get_value_kind()
{
return ValueKind::UnaryOperator;
}
UnaryOperator(UnaryOps uop, Value *value);
UnaryOps getOpcode() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
UnaryOps op;
};
class BinaryOperator : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::BinaryOperator;
}
BinaryOperator(Value *LHS, Value *RHS, BinaryOps op);
BinaryOps getOpcode() const;
void setFast(bool enabled);
bool isFast() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
BinaryOps op;
bool fast_math = false;
};
class CastInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Cast;
}
CastInst(Type *type, Value *value, Instruction::CastOps op);
Instruction::CastOps getOpcode() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Instruction::CastOps op;
};
class SelectInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Select;
}
SelectInst(Value *true_value, Value *false_value, Value *cond);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class ExtractValueInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::ExtractValue;
}
ExtractValueInst(Type *type, Value *aggregate, Vector<unsigned> indices);
Value *getAggregateOperand() const;
unsigned getNumIndices() const;
const unsigned *getIndices() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Vector<unsigned> indices;
};
class AllocaInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Alloca;
}
AllocaInst(Type *pointer_type, Type *element_type, Value *size);
Value *getArraySize() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *array_size;
};
class GetElementPtrInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::GetElementPtr;
}
GetElementPtrInst(Type *pointer_type, Vector<Value *> arguments, bool inbounds);
bool isInBounds() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
bool inbounds;
};
class LoadInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Load;
}
LoadInst(Type *type, Value *ptr);
Value *getPointerOperand() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class StoreInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Store;
}
StoreInst(Value *ptr, Value *value);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class CmpInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::CompareBase;
}
CmpInst(ValueKind kind, Predicate pred, Value *LHS, Value *RHS);
Predicate getPredicate() const;
static bool is_base_of_value_kind(ValueKind kind);
private:
Predicate pred;
};
class FCmpInst : public CmpInst
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::FCmp;
}
FCmpInst(Predicate pred, Value *LHS, Value *RHS);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class ICmpInst : public CmpInst
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::ICmp;
}
ICmpInst(Predicate pred, Value *LHS, Value *RHS);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
class BranchInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Branch;
}
BranchInst(BasicBlock *true_block, BasicBlock *false_block, Value *cond);
explicit BranchInst(BasicBlock *true_block);
bool isConditional() const;
Value *getCondition() const;
unsigned getNumSuccessors() const;
BasicBlock *getSuccessor(unsigned index) const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
BasicBlock *bbs[2] = {};
unsigned num_blocks = 0;
Value *cond = nullptr;
};
class SwitchInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::Switch;
}
SwitchInst(Value *cond, BasicBlock *default_block, unsigned num_cases);
void addCase(Value *case_value, BasicBlock *bb);
struct Case
{
Value *value;
BasicBlock *bb;
BasicBlock *getCaseSuccessor() const;
ConstantInt *getCaseValue() const;
};
Vector<Case>::const_iterator case_begin() const;
Vector<Case>::const_iterator case_end() const;
Value *getCondition() const;
BasicBlock *getDefaultDest() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *cond;
BasicBlock *default_block;
Vector<Case> cases;
};
class PHINode : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::PHI;
}
PHINode(Type *type, size_t num_edges);
unsigned getNumIncomingValues() const;
Value *getIncomingValue(unsigned index) const;
BasicBlock *getIncomingBlock(unsigned index) const;
void add_incoming(Value *value, BasicBlock *bb);
bool resolve_proxy_values_incoming();
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
struct Incoming
{
Value *value;
BasicBlock *bb;
};
Vector<Incoming> incoming;
};
class AtomicRMWInst : public Instruction
{
public:
enum class BinOp
{
Invalid,
Xchg,
Add,
Sub,
And,
Nand,
Or,
Xor,
Max,
Min,
UMax,
UMin,
FAdd, // wat
FSub
};
static constexpr ValueKind get_value_kind()
{
return ValueKind::AtomicRMW;
}
AtomicRMWInst(Type *type, Value *ptr, Value *value, BinOp op);
Value *getPointerOperand() const;
Value *getValOperand() const;
BinOp getOperation() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *ptr;
Value *value;
BinOp op;
};
class AtomicCmpXchgInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::AtomicCmpXchg;
}
AtomicCmpXchgInst(Value *ptr, Value *cmp, Value *new_value, Type *type_override = nullptr);
Value *getPointerOperand() const;
Value *getNewValOperand() const;
Value *getCompareOperand() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *ptr;
Value *new_value;
Value *cmp_value;
};
class ShuffleVectorInst : public Instruction
{
public:
ShuffleVectorInst(Type *type, Value *a, Value *b, Value *shuf);
static constexpr ValueKind get_value_kind()
{
return ValueKind::ShuffleVector;
}
int getMaskValue(unsigned index) const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Vector<int> shuffle_mask;
};
class ExtractElementInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::ExtractElement;
}
ExtractElementInst(Value *vec, Value *offset);
Value *getVectorOperand() const;
Value *getIndexOperand() const;
LLVMBC_DEFAULT_VALUE_KIND_IMPL
private:
Value *vec;
Value *index;
};
class InsertElementInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::InsertElement;
}
InsertElementInst(Value *vec, Value *value, Value *index);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
// Extension of LLVM to better map to SPIR-V / DXBC-IR
class CompositeConstructInst : public Instruction
{
public:
static constexpr ValueKind get_value_kind()
{
return ValueKind::CompositeConstruct;
}
CompositeConstructInst(Type *type, Vector<Value *> constituents);
LLVMBC_DEFAULT_VALUE_KIND_IMPL
};
} // namespace LLVMBC
================================================
FILE: bc/iterator.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include <stddef.h>
namespace LLVMBC
{
// An iterator adaptor which lets us receive reference types instead of pointer types.
template <typename T, typename Iter>
struct IteratorAdaptor
{
IteratorAdaptor(Iter iter_)
: iter(iter_)
{
}
T &operator*()
{
return **iter;
}
T *operator->()
{
return *iter;
}
IteratorAdaptor operator++()
{
++iter;
return *this;
}
bool operator==(const IteratorAdaptor &other) const
{
return iter == other.iter;
}
bool operator!=(const IteratorAdaptor &other) const
{
return !(*this == other);
}
ptrdiff_t operator-(const IteratorAdaptor &other) const
{
return iter - other.iter;
}
Iter iter;
};
} // namespace LLVMBC
================================================
FILE: bc/metadata.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "metadata.hpp"
#include "module.hpp"
#include "value.hpp"
#include <assert.h>
#include <utility>
namespace LLVMBC
{
MDOperand::MDOperand(Module *parent_, MetadataKind kind_)
: parent(parent_)
, kind(kind_)
{
}
MDOperand::MDOperand(Module *parent_)
: parent(parent_)
{
}
Module *MDOperand::getParent() const
{
return parent;
}
MetadataKind MDOperand::get_metadata_kind() const
{
return kind;
}
MDNode::MDNode(Module *module, Vector<MDOperand *> operands_)
: MDOperand(module, MetadataKind::Node)
, operands(std::move(operands_))
{
}
unsigned MDNode::getNumOperands() const
{
return unsigned(operands.size());
}
MDOperand &MDNode::getOperand(unsigned index) const
{
assert(index < operands.size());
return *operands[index];
}
uint64_t MDNode::get_tween_id() const
{
return tween;
}
void MDNode::set_tween_id(uint64_t id)
{
tween = id;
}
NamedMDNode::NamedMDNode(Module *module, String name_, Vector<MDNode *> operands_)
: MDOperand(module, MetadataKind::NamedNode)
, name(std::move(name_))
, operands(std::move(operands_))
{
}
unsigned NamedMDNode::getNumOperands() const
{
return unsigned(operands.size());
}
MDNode *NamedMDNode::getOperand(unsigned index) const
{
assert(index < operands.size());
return operands[index];
}
const String &NamedMDNode::getName() const
{
return name;
}
ConstantAsMetadata::ConstantAsMetadata(Module *module, Constant *value_)
: MDOperand(module, MetadataKind::Constant)
, value(value_)
{
}
Constant *ConstantAsMetadata::getValue() const
{
return value;
}
MDString::MDString(LLVMBC::Module *module, String str_)
: MDOperand(module, MetadataKind::String)
, str(std::move(str_))
{
}
const String &MDString::getString() const
{
return str;
}
} // namespace LLVMBC
================================================
FILE: bc/metadata.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
#include "data_structures.hpp"
namespace LLVMBC
{
class Value;
class Module;
class Constant;
enum class MetadataKind
{
NamedNode,
Node,
Constant,
String,
None
};
class MDOperand
{
public:
explicit MDOperand(Module *parent);
MDOperand(Module *parent, MetadataKind kind);
Module *getParent() const;
MetadataKind get_metadata_kind() const;
explicit operator bool() const
{
return kind != MetadataKind::None;
}
private:
Module *parent;
MetadataKind kind = MetadataKind::None;
};
class MDNode : public MDOperand
{
public:
static constexpr MetadataKind get_metadata_kind()
{
return MetadataKind::Node;
}
MDNode(Module *module, Vector<MDOperand *> operands);
MDOperand &getOperand(unsigned index) const;
unsigned getNumOperands() const;
void set_tween_id(uint64_t id);
uint64_t get_tween_id() const;
private:
Vector<MDOperand *> operands;
uint64_t tween = 0;
};
class NamedMDNode : public MDOperand
{
public:
static constexpr MetadataKind get_metadata_kind()
{
return MetadataKind::NamedNode;
}
NamedMDNode(Module *module, String name, Vector<MDNode *> operands);
const String &getName() const;
MDNode *getOperand(unsigned index) const;
unsigned getNumOperands() const;
private:
String name;
Vector<MDNode *> operands;
};
class ConstantAsMetadata : public MDOperand
{
public:
static constexpr MetadataKind get_metadata_kind()
{
return MetadataKind::Constant;
}
ConstantAsMetadata(Module *module, Constant *value);
Constant *getValue() const;
private:
Constant *value;
};
class MDString : public MDOperand
{
public:
static constexpr MetadataKind get_metadata_kind()
{
return MetadataKind::String;
}
MDString(Module *module, String str);
const String &getString() const;
private:
String str;
};
} // namespace LLVMBC
================================================
FILE: bc/module.cpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "module.hpp"
#include "cast.hpp"
#include "context.hpp"
#include "function.hpp"
#include "instruction.hpp"
#include "logging.hpp"
#include "metadata.hpp"
#include "type.hpp"
#include "value.hpp"
#include <algorithm>
#include "llvm_decoder.h"
namespace LLVMBC
{
enum class KnownBlocks : uint32_t
{
BLOCKINFO = 0,
// 1-7 reserved,
MODULE_BLOCK = 8,
PARAMATTR_BLOCK = 9,
PARAMATTR_GROUP_BLOCK = 10,
CONSTANTS_BLOCK = 11,
FUNCTION_BLOCK = 12,
TYPE_SYMTAB_BLOCK = 13,
VALUE_SYMTAB_BLOCK = 14,
METADATA_BLOCK = 15,
METADATA_ATTACHMENT = 16,
TYPE_BLOCK = 17,
};
enum class AttributeRecord : uint32_t
{
NONE = 0,
ALIGNMENT = 1,
BY_VAL = 3,
STACK_ALIGNMENT = 25,
DEREFERENCEABLE = 41,
DEREFERENCEABLE_OR_NULL = 42,
ALLOC_SIZE = 51
};
enum class ModuleRecord : uint32_t
{
VERSION = 1,
TRIPLE = 2,
DATALAYOUT = 3,
GLOBAL_VARIABLE = 7,
FUNCTION = 8,
};
enum class ConstantsRecord : uint32_t
{
SETTYPE = 1,
CONST_NULL = 2,
UNDEF = 3,
INTEGER = 4,
WIDE_INTEGER = 5,
FLOAT = 6,
AGGREGATE = 7,
STRING = 8,
BINOP = 10,
CE_CAST = 11,
GEP = 12,
INBOUNDS_GEP = 20,
DATA = 22,
GEP_WITH_INRANGE_INDEX = 24
};
enum class FunctionRecord : uint32_t
{
DECLAREBLOCKS = 1,
INST_BINOP = 2,
INST_CAST = 3,
INST_GEP_OLD = 4,
INST_SELECT = 5,
INST_EXTRACTELT = 6,
INST_INSERTELT = 7,
INST_SHUFFLEVEC = 8,
INST_CMP = 9,
INST_RET = 10,
INST_BR = 11,
INST_SWITCH = 12,
INST_INVOKE = 13,
INST_UNREACHABLE = 15,
INST_PHI = 16,
INST_ALLOCA = 19,
INST_LOAD = 20,
INST_VAARG = 23,
INST_STORE_OLD = 24,
INST_EXTRACTVAL = 26,
INST_INSERTVAL = 27,
INST_CMP2 = 28,
INST_VSELECT = 29,
INST_INBOUNDS_GEP_OLD = 30,
INST_INDIRECTBR = 31,
DEBUG_LOC_AGAIN = 33,
INST_CALL = 34,
DEBUG_LOC = 35,
INST_FENCE = 36,
INST_CMPXCHG_OLD = 37,
INST_ATOMICRMW = 38,
INST_RESUME = 39,
INST_LANDINGPAD_OLD = 40,
INST_LOADATOMIC = 41,
INST_STOREATOMIC_OLD = 42,
INST_GEP = 43,
INST_STORE = 44,
INST_STOREATOMIC = 45,
INST_CMPXCHG = 46,
INST_LANDINGPAD = 47,
INST_CLEANUPRET = 48,
INST_CATCHRET = 49,
INST_CATCHPAD = 50,
INST_CLEANUPPAD = 51,
INST_CATCHSWITCH = 52,
OPERAND_BUNDLE = 55,
INST_UNOP = 56,
INST_CALLBR = 57,
};
enum class ValueSymtabRecord : uint32_t
{
ENTRY = 1,
BBENTRY = 2,
FNENTRY = 3,
COMBINED_ENTRY = 5,
};
enum class MetaDataRecord : uint32_t
{
STRING_OLD = 1,
VALUE = 2,
NODE = 3,
NAME = 4,
DISTINCT_NODE = 5,
KIND = 6,
LOCATION = 7,
OLD_NODE = 8,
OLD_FN_NODE = 9,
NAMED_NODE = 10,
ATTACHMENT = 11,
GENERIC_DEBUG = 12,
SUBRANGE = 13,
ENUMERATOR = 14,
BASIC_TYPE = 15,
FILE = 16,
DERIVED_TYPE = 17,
COMPOSITE_TYPE = 18,
SUBROUTINE_TYPE = 19,
COMPILE_UNIT = 20,
SUBPROGRAM = 21,
LEXICAL_BLOCK = 22,
LEXICAL_BLOCK_FILE = 23,
NAMESPACE = 24,
TEMPLATE_TYPE = 25,
TEMPLATE_VALUE = 26,
GLOBAL_VAR = 27,
LOCAL_VAR = 28,
EXPRESSION = 29,
OBJC_PROPERTY = 30,
IMPORTED_ENTITY = 31,
MODULE = 32,
MACRO = 33,
MACRO_FILE = 34,
STRINGS = 35,
GLOBAL_DECL_ATTACHMENT = 36,
GLOBAL_VAR_EXPR = 37,
INDEX_OFFSET = 38,
INDEX = 39,
LABEL = 40,
COMMON_BLOCK = 44,
};
enum class AttributeCodes : uint32_t
{
CodeEntryOld = 1,
CodeEntry = 2,
GroupCodeEntry = 3
};
enum class TypeRecord : uint32_t
{
NUMENTRY = 1,
VOID_TYPE = 2,
FLOAT = 3,
DOUBLE = 4,
LABEL = 5,
OPAQUE_TYPE = 6,
INTEGER = 7,
POINTER = 8,
FUNCTION_OLD = 9,
HALF = 10,
ARRAY = 11,
VECTOR = 12,
METADATA = 16,
STRUCT_ANON = 18,
STRUCT_NAME = 19,
STRUCT_NAMED = 20,
FUNCTION = 21,
TOKEN = 22,
};
enum class UnaryOp : uint32_t
{
FNEG = 0
};
enum class BinOp : uint32_t
{
ADD = 0,
SUB = 1,
MUL = 2,
UDIV = 3,
SDIV = 4,
UREM = 5,
SREM = 6,
SHL = 7,
LSHR = 8,
ASHR = 9,
AND = 10,
OR = 11,
XOR = 12
};
enum class AtomicBinOp : uint32_t
{
RMW_XCHG = 0,
RMW_ADD = 1,
RMW_SUB = 2,
RMW_AND = 3,
RMW_NAND = 4,
RMW_OR = 5,
RMW_XOR = 6,
RMW_MAX = 7,
RMW_MIN = 8,
RMW_UMAX = 9,
RMW_UMIN = 10,
RMW_FADD = 11,
RMW_FSUB = 12
};
enum class CastOp : uint32_t
{
TRUNC = 0,
ZEXT = 1,
SEXT = 2,
FPTOUI = 3,
FPTOSI = 4,
UITOFP = 5,
SITOFP = 6,
FPTRUNC = 7,
FPEXT = 8,
PTRTOINT = 9,
INTTOPTR = 10,
BITCAST = 11,
ADDSPACECAST = 12
};
enum CallFlagBits
{
CALL_TAIL_BIT = 1 << 0,
CALL_CCONV_BIT = 1 << 1,
CALL_MUSTTAIL_BIT = 1 << 14,
CALL_EXPLICIT_TYPE_BIT = 1 << 15,
CALL_NOTAIL_BIT = 1 << 16,
CALL_FMF_BIT = 1 << 17
};
enum FastMathFlagBits
{
FAST_MATH_UNSAFE_ALGEBRA_BIT = 1 << 0,
FAST_MATH_ALLOW_CONTRACT_BIT = 1 << 5
};
static int64_t decode_sign_rotated_value(uint64_t v)
{
bool sign = (v & 1) != 0;
v >>= 1;
if (sign)
v = v ? -int64_t(v) : (1ull << 63u);
return int64_t(v);
}
struct ModuleParseContext
{
Function *function = nullptr;
Module *module = nullptr;
LLVMContext *context = nullptr;
Vector<BasicBlock *> basic_blocks;
Vector<Value *> values;
Vector<Instruction *> instructions;
Vector<Type *> types;
Vector<Function *> functions_with_bodies;
UnorderedMap<uint64_t, MDOperand *> metadata;
UnorderedMap<uint64_t, String> metadata_kind_map;
Vector<Vector<std::pair<String, String>>> attribute_lists;
UnorderedMap<uint64_t, Vector<std::pair<String, String>>> attribute_groups;
Type *constant_type = nullptr;
String current_metadata_name;
bool parse_function_child_block(const BlockOrRecord &entry);
bool parse_record(const BlockOrRecord &entry);
bool parse_constants_record(const BlockOrRecord &entry);
bool parse_constants_block(const BlockOrRecord &entry);
bool parse_metadata_block(const BlockOrRecord &entry);
bool parse_paramattr_block(const BlockOrRecord &entry);
bool parse_paramattr_group_block(const BlockOrRecord &entry);
bool parse_metadata_attachment_record(const BlockOrRecord &entry);
bool parse_metadata_record(const BlockOrRecord &entry, unsigned index);
Type *get_constant_type();
bool parse_function_body(const BlockOrRecord &entry);
bool parse_types(const BlockOrRecord &entry);
bool parse_value_symtab(const BlockOrRecord &entry);
bool parse_function_record(const BlockOrRecord &entry);
bool parse_global_variable_record(const BlockOrRecord &entry);
bool parse_version_record(const BlockOrRecord &entry);
bool parse_type(const BlockOrRecord &entry);
bool add_instruction(Instruction *inst);
bool add_value(Value *value);
bool add_type(Type *type);
Type *get_type(uint64_t index);
bool finish_basic_block();
bool add_successor(BasicBlock *bb);
BasicBlock *get_basic_block(uint64_t index) const;
BasicBlock *current_bb = nullptr;
unsigned basic_block_index = 0;
Value *get_value(uint64_t op, Type *expected_type = nullptr, bool force_absolute = false);
std::pair<Value *, Type *> get_value_and_type(const Vector<uint64_t> &ops, unsigned &index);
Value *get_value(const Vector<uint64_t> &ops, unsigned &index, Type *expected_type);
Value *get_value_signed(uint64_t op, Type *expected_type = nullptr);
MDOperand *get_metadata(uint64_t index) const;
const char *get_metadata_kind(uint64_t index) const;
Instruction *get_instruction(uint64_t index) const;
Vector<ValueProxy *> pending_forward_references;
Vector<std::pair<GlobalVariable *, uint64_t>> global_initializations;
bool resolve_forward_references();
bool resolve_global_initializations();
uint64_t tween_id = 1;
uint64_t metadata_tween_id = 1;
bool use_relative_id = true;
bool use_strtab = false;
bool seen_first_function_body = false;
};
ValueProxy::ValueProxy(Type *type, ModuleParseContext &context_, uint64_t id_)
: Value(type, ValueKind::Proxy)
, id(id_)
, context(context_)
{
}
bool ValueProxy::resolve()
{
if (proxy)
return true;
if (id >= context.values.size())
{
LOGE("Value proxy is out of range.\n");
return false;
}
proxy = context.values[id];
while (proxy && proxy->get_value_kind() == ValueKind::Proxy)
{
cast<ValueProxy>(proxy)->resolve();
proxy = cast<ValueProxy>(proxy)->get_proxy_value();
}
if (!proxy)
{
LOGE("Failed to resolve proxy value.\n");
return false;
}
return true;
}
Value *ValueProxy::get_proxy_value() const
{
return proxy;
}
bool ModuleParseContext::finish_basic_block()
{
basic_block_index++;
if (basic_block_index >= basic_blocks.size())
current_bb = nullptr;
else
{
current_bb = basic_blocks[basic_block_index];
current_bb->set_tween_id(tween_id++);
}
return true;
}
bool ModuleParseContext::add_successor(BasicBlock *bb)
{
if (!current_bb)
{
LOGE("No basic block is active in add_successor().\n");
return false;
}
current_bb->add_successor(bb);
return true;
}
BasicBlock *ModuleParseContext::get_basic_block(uint64_t index) const
{
if (index >= basic_blocks.size())
{
LOGE("Basic block index is out of bounds!\n");
return nullptr;
}
return basic_blocks[index];
}
Value *ModuleParseContext::get_value(uint64_t op, Type *expected_type, bool force_absolute)
{
if (!force_absolute && use_relative_id)
op = uint32_t(values.size() - op);
if (op >= values.size())
{
if (!expected_type)
{
LOGE("Must have an expected type for forward references!\n");
return nullptr;
}
auto *proxy = context->construct<ValueProxy>(expected_type, *this, op);
pending_forward_references.push_back(proxy);
return proxy;
}
else
{
// A pointer to function and a constant function do match.
if (auto *ptr_type = dyn_cast<PointerType>(expected_type))
if (ptr_type->getPointerElementType()->getTypeID() == Type::TypeID::FunctionTyID)
expected_type = ptr_type->getPointerElementType();
if (expected_type && expected_type != values[op]->getType())
{
LOGE("Type mismatch.\n");
return nullptr;
}
return values[op];
}
}
Value *ModuleParseContext::get_value(const Vector<uint64_t> &ops, unsigned &index, Type *expected_type)
{
if (index >= ops.size())
return nullptr;
return get_value(ops[index++], expected_type);
}
std::pair<Value *, Type *> ModuleParseContext::get_value_and_type(const Vector<uint64_t> &ops, unsigned &index)
{
if (index >= ops.size())
return {};
uint64_t op = ops[index++];
if (use_relative_id)
op = uint32_t(values.size() - op);
if (op < values.size())
{
// Normal reference.
return { values[op], values[op]->getType() };
}
else
{
// Forward reference, the type is encoded in the next element.
if (index >= ops.size())
return {};
auto *type = get_type(ops[index++]);
auto *proxy = context->construct<ValueProxy>(type, *this, op);
pending_forward_references.push_back(proxy);
return { proxy, type };
}
}
Instruction *ModuleParseContext::get_instruction(uint64_t index) const
{
if (index >= instructions.size())
{
LOGE("Instruction index is out of range!\n");
return nullptr;
}
return instructions[index];
}
MDOperand *ModuleParseContext::get_metadata(uint64_t index) const
{
auto itr = metadata.find(index);
if (itr != metadata.end())
return itr->second;
else
{
// Need to return a null-node like this since MDOperand is used as a reference in the LLVM API for some reason.
return context->construct<MDOperand>(module);
}
}
const char *ModuleParseContext::get_metadata_kind(uint64_t index) const
{
auto itr = metadata_kind_map.find(index);
if (itr != metadata_kind_map.end())
return itr->second.c_str();
else
return nullptr;
}
Value *ModuleParseContext::get_value_signed(uint64_t op, Type *expected_type)
{
int64_t signed_op = decode_sign_rotated_value(op);
if (use_relative_id)
signed_op = values.size() - signed_op;
op = signed_op;
if (op >= values.size())
{
if (!expected_type)
{
LOGE("Must have an expected type for forward references!\n");
return nullptr;
}
auto *proxy = context->construct<ValueProxy>(expected_type, *this, op);
pending_forward_references.push_back(proxy);
return proxy;
}
else
return values[op];
}
bool ModuleParseContext::add_instruction(Instruction *inst)
{
instructions.push_back(inst);
if (current_bb)
current_bb->add_instruction(inst);
else
{
LOGE("No basic block is currently set!\n");
return false;
}
if (inst->isTerminator())
return finish_basic_block();
else
return add_value(inst);
}
bool ModuleParseContext::add_value(Value *value)
{
if (value->getType()->getTypeID() != Type::TypeID::VoidTyID)
{
value->set_tween_id(tween_id++);
values.push_back(value);
}
return true;
}
Type *ModuleParseContext::get_constant_type()
{
if (constant_type)
return constant_type;
else
return Type::getInt32Ty(*context);
}
static Type *resolve_gep_element_type(Type *type, const Vector<Value *> &args)
{
for (unsigned i = 2; i < args.size(); i++)
{
auto *arg = args[i];
if (type->getTypeID() == Type::TypeID::StructTyID)
{
auto *const_int = dyn_cast<ConstantInt>(arg);
if (!const_int)
{
LOGE("Indexing into a struct without a constant integer.\n");
return nullptr;
}
unsigned index = const_int->getUniqueInteger().getZExtValue();
if (index >= cast<StructType>(type)->getNumElements())
{
LOGE("Struct element index out of range.\n");
return nullptr;
}
type = cast<StructType>(type)->getElementType(index);
}
else if (type->getTypeID() == Type::TypeID::ArrayTyID)
{
type = type->getArrayElementType();
}
else if (type->getTypeID() == Type::TypeID::VectorTyID)
{
type = cast<VectorType>(type)->getElementType();
}
else
return nullptr;
}
return type;
}
static BinaryOperator::BinaryOps translate_binop(BinOp op, Type *type)
{
bool is_fp = type->isFloatingPointTy();
switch (op)
{
case BinOp::ADD:
return is_fp ? BinaryOperator::BinaryOps::FAdd : BinaryOperator::BinaryOps::Add;
case BinOp::SUB:
return is_fp ? BinaryOperator::BinaryOps::FSub : BinaryOperator::BinaryOps::Sub;
case BinOp::MUL:
return is_fp ? BinaryOperator::BinaryOps::FMul : BinaryOperator::BinaryOps::Mul;
case BinOp::UDIV:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::UDiv;
case BinOp::SDIV:
return is_fp ? BinaryOperator::BinaryOps::FDiv : BinaryOperator::BinaryOps::SDiv;
case BinOp::UREM:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::URem;
case BinOp::SREM:
return is_fp ? BinaryOperator::BinaryOps::FRem : BinaryOperator::BinaryOps::SRem;
case BinOp::SHL:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::Shl;
case BinOp::LSHR:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::LShr;
case BinOp::ASHR:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::AShr;
case BinOp::AND:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::And;
case BinOp::OR:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::Or;
case BinOp::XOR:
return is_fp ? BinaryOperator::BinaryOps::InvalidBinaryOp : BinaryOperator::BinaryOps::Xor;
default:
return BinaryOperator::BinaryOps::InvalidBinaryOp;
}
}
static Instruction::CastOps translate_castop(CastOp op)
{
switch (op)
{
case CastOp::TRUNC:
return Instruction::Trunc;
case CastOp::ZEXT:
return Instruction::ZExt;
case CastOp::SEXT:
return Instruction::SExt;
case CastOp::FPTOUI:
return Instruction::FPToUI;
case CastOp::FPTOSI:
return Instruction::FPToSI;
case CastOp::UITOFP:
return Instruction::UIToFP;
case CastOp::SITOFP:
return Instruction::SIToFP;
case CastOp::FPTRUNC:
return Instruction::FPTrunc;
case CastOp::FPEXT:
return Instruction::FPExt;
case CastOp::PTRTOINT:
return Instruction::PtrToInt;
case CastOp::INTTOPTR:
return Instruction::IntToPtr;
case CastOp::BITCAST:
return Instruction::BitCast;
case CastOp::ADDSPACECAST:
return Instruction::AddrSpaceCast;
}
return Instruction::CastOps::InvalidCastOp;
}
bool ModuleParseContext::parse_constants_record(const BlockOrRecord &entry)
{
if (entry.IsBlock())
return true;
switch (ConstantsRecord(entry.id))
{
case ConstantsRecord::SETTYPE:
if (entry.ops.size() < 1)
return false;
constant_type = get_type(entry.ops[0]);
break;
case ConstantsRecord::CONST_NULL:
{
auto *type = get_constant_type();
Value *value = nullptr;
if (type->isIntegerTy())
value = ConstantInt::get(type, 0);
else if (type->isFloatingPointTy())
value = ConstantFP::get(type, 0);
else if (isa<ArrayType>(type) || isa<StructType>(type) || isa<VectorType>(type))
value = context->construct<ConstantAggregateZero>(type);
else if (isa<PointerType>(type))
value = context->construct<ConstantPointerNull>(type);
if (!value)
{
LOGE("Unknown type for CONST_NULL.\n");
return false;
}
values.push_back(value);
break;
}
case ConstantsRecord::UNDEF:
{
auto *type = get_constant_type();
values.push_back(UndefValue::get(type));
break;
}
case ConstantsRecord::INTEGER:
{
if (entry.ops.size() < 1)
return false;
auto *type = get_constant_type();
if (!type->isIntegerTy())
{
LOGE("Constant type is not integer.\n");
return false;
}
uint64_t literal = entry.ops[0];
int64_t signed_literal = decode_sign_rotated_value(literal);
ConstantInt *value = ConstantInt::get(type, signed_literal);
values.push_back(value);
break;
}
case ConstantsRecord::WIDE_INTEGER:
LOGE("WIDE_INTEGER unimplemented.\n");
return false;
case ConstantsRecord::FLOAT:
{
if (entry.ops.size() < 1)
return false;
auto *type = get_constant_type();
if (!type->isFloatingPointTy())
{
LOGE("Constant type is not FP.\n");
return false;
}
ConstantFP *value = ConstantFP::get(type, entry.ops[0]);
values.push_back(value);
break;
}
case ConstantsRecord::AGGREGATE:
{
Vector<Value *> constants;
Value *value;
constants.reserve(entry.ops.size());
if (auto *struct_type = dyn_cast<StructType>(get_constant_type()))
{
if (entry.ops.size() != struct_type->getStructNumElements())
{
LOGE("Mismatch in struct element counts.\n");
return false;
}
for (unsigned i = 0; i < struct_type->getStructNumElements(); i++)
constants.push_back(get_value(entry.ops[i], struct_type->getStructElementType(i), true));
value = context->construct<ConstantAggregate>(get_constant_type(), std::move(constants));
}
else if (isa<ArrayType>(get_constant_type()))
{
auto *element_type = get_constant_type()->getArrayElementType();
for (auto &op : entry.ops)
constants.push_back(get_value(op, element_type, true));
value = context->construct<ConstantAggregate>(get_constant_type(), std::move(constants));
}
else if (isa<VectorType>(get_constant_type()))
{
auto *element_type = cast<VectorType>(get_constant_type())->getElementType();
for (auto &op : entry.ops)
constants.push_back(get_value(op, element_type, true));
value = context->construct<ConstantAggregate>(get_constant_type(), std::move(constants));
}
else
{
value = UndefValue::get(get_constant_type());
}
values.push_back(value);
break;
}
case ConstantsRecord::STRING:
LOGE("STRING unimplemented.\n");
return false;
case ConstantsRecord::BINOP:
{
unsigned index = 0;
auto *type = get_constant_type();
auto op = translate_binop(BinOp(entry.ops[index++]), type);
auto *a = get_value(entry.ops[index++], type, true);
auto *b = get_value(entry.ops[index++], type, true);
auto elements = Vector<Value *>{a, b};
Value *value = context->construct<ConstantExpr>(op, type, std::move(elements));
values.push_back(value);
break;
}
case ConstantsRecord::CE_CAST:
{
unsigned index = 0;
auto op = translate_castop(CastOp(entry.ops[index++]));
auto *type = get_constant_type();
auto *input_value_type = get_type(entry.ops[index++]);
if (!input_value_type)
return false;
auto *input_value = get_value(entry.ops[index++], input_value_type, true);
auto elements = Vector<Value *>{input_value};
Value *value = context->construct<ConstantExpr>(op, type, std::move(elements));
values.push_back(value);
break;
}
case ConstantsRecord::DATA:
{
bool is_vector = false;
Type *element_type = nullptr;
if (isa<ArrayType>(get_constant_type()))
element_type = get_constant_type()->getArrayElementType();
else if (isa<VectorType>(get_constant_type()))
{
element_type = cast<VectorType>(get_constant_type())->getElementType();
is_vector = true;
}
else
{
LOGE("Unknown DATA type.\n");
return false;
}
bool is_fp = element_type->isFloatingPointTy();
bool is_int = element_type->isIntegerTy();
Vector<Value *> constants;
constants.reserve(entry.ops.size());
if (is_fp)
{
for (auto &op : entry.ops)
constants.push_back(ConstantFP::get(element_type, op));
}
else if (is_int)
{
for (auto &op : entry.ops)
constants.push_back(ConstantInt::get(element_type, op));
}
else
{
LOGE("Unknown DATA type.\n");
return false;
}
Value *value;
if (is_vector)
value = context->construct<ConstantDataVector>(get_constant_type(), std::move(constants));
else
value = context->construct<ConstantDataArray>(get_constant_type(), std::move(constants));
values.push_back(value);
break;
}
case ConstantsRecord::GEP:
case ConstantsRecord::INBOUNDS_GEP:
case ConstantsRecord::GEP_WITH_INRANGE_INDEX:
{
if (entry.ops.size() < 2)
return false;
Type *pointee_type = nullptr;
unsigned index = 0;
if (ConstantsRecord(entry.id) == ConstantsRecord::GEP_WITH_INRANGE_INDEX ||
(entry.ops.size() & 1))
{
pointee_type = get_type(entry.ops[index++]);
}
if (ConstantsRecord(entry.id) == ConstantsRecord::GEP_WITH_INRANGE_INDEX)
index++;
Vector<Value *> elements;
elements.reserve(entry.ops.size() / 2);
while (index < entry.ops.size())
{
auto *type = get_type(entry.ops[index++]);
auto *value = get_value(entry.ops[index++], type, true);
elements.push_back(value);
}
if (elements.size() < 2)
return false;
if (!pointee_type)
pointee_type = elements[0]->getType()->getPointerElementType();
pointee_type = resolve_gep_element_type(pointee_type, elements);
if (!pointee_type)
return false;
pointee_type = PointerType::get(pointee_type, cast<PointerType>(elements[0]->getType())->getAddressSpace());
auto *value = context->construct<ConstantExpr>(Instruction::GetElementPtr, pointee_type, std::move(elements));
values.push_back(value);
break;
}
default:
LOGE("UNKNOWN unimplemented.\n");
return false;
}
return true;
}
bool ModuleParseContext::parse_constants_block(const BlockOrRecord &entry)
{
constant_type = nullptr;
for (auto &child : entry.children)
if (!parse_constants_record(child))
return false;
return true;
}
bool ModuleParseContext::parse_metadata_attachment_record(const BlockOrRecord &entry)
{
if (MetaDataRecord(entry.id) != MetaDataRecord::ATTACHMENT)
return true;
if (entry.ops.size() < 1)
return false;
size_t size = entry.ops.size();
size_t num_nodes = (size - 1) / 2;
auto *inst = get_instruction(entry.ops[0]);
if (!inst)
{
LOGE("Invalid instruction.\n");
return false;
}
for (size_t i = 0; i < num_nodes; i++)
{
auto *kind = get_metadata_kind(entry.ops[2 * i + 1]);
auto *operand = get_metadata(entry.ops[2 * i + 2]);
auto *node = dyn_cast<MDNode>(operand);
if (!kind)
{
LOGE("Invalid metadata kind.\n");
return false;
}
if (!node)
{
LOGE("Invalid metadata attachment.\n");
return false;
}
inst->setMetadata(kind, node);
}
return true;
}
bool ModuleParseContext::parse_metadata_record(const BlockOrRecord &entry, unsigned index)
{
switch (MetaDataRecord(entry.id))
{
case MetaDataRecord::NAME:
{
current_metadata_name = entry.getString();
break;
}
case MetaDataRecord::NAMED_NODE:
{
Vector<MDNode *> ops;
ops.reserve(entry.ops.size());
for (auto &op : entry.ops)
{
auto *md = get_metadata(op);
auto *node = dyn_cast<MDNode>(md);
ops.push_back(node);
}
auto *node = context->construct<NamedMDNode>(module, current_metadata_name, std::move(ops));
module->add_named_metadata(current_metadata_name, node);
metadata[index] = node;
break;
}
case MetaDataRecord::DISTINCT_NODE:
case MetaDataRecord::NODE:
{
Vector<MDOperand *> ops;
ops.reserve(entry.ops.size());
for (auto &op : entry.ops)
{
// For some reason, here metadata is indexed with -1?
auto *md = get_metadata(op - 1);
ops.push_back(md);
}
auto *node = context->construct<MDNode>(module, std::move(ops));
node->set_tween_id(metadata_tween_id++);
module->add_unnamed_metadata(node);
metadata[index] = node;
break;
}
case MetaDataRecord::STRING_OLD:
{
auto *node = context->construct<MDString>(module, entry.getString());
metadata[index] = node;
break;
}
case MetaDataRecord::VALUE:
{
if (entry.ops.size() < 2)
return false;
auto *value = get_value(entry.ops[1], nullptr, true);
if (!value)
{
LOGE("Null value!\n");
return false;
}
auto *constant_value = dyn_cast<Constant>(value);
if (!constant_value)
{
LOGE("Not a constant!\n");
return false;
}
auto *node = context->construct<ConstantAsMetadata>(module, constant_value);
metadata[index] = node;
break;
}
case MetaDataRecord::KIND:
{
if (entry.ops.size() < 1)
return false;
metadata_kind_map[entry.ops[0]] = entry.getString(1);
break;
}
default:
break;
}
return true;
}
bool ModuleParseContext::parse_metadata_block(const BlockOrRecord &entry)
{
unsigned index = 0;
for (auto &child : entry.children)
if (!parse_metadata_record(child, index++))
return false;
return true;
}
bool ModuleParseContext::parse_paramattr_block(const BlockOrRecord &entry)
{
for (auto &child : entry.children)
{
if (!child.IsRecord())
continue;
// Don't support the OLD variant unless we observe it in the wild.
// DXC doesn't generate it.
if (AttributeCodes(child.id) != AttributeCodes::CodeEntry)
return false;
Vector<std::pair<String, String>> pairs;
for (auto op : child.ops)
{
auto &grp = attribute_groups[op];
for (auto &elem : grp)
pairs.push_back(elem);
}
attribute_lists.push_back(std::move(pairs));
}
return true;
}
bool ModuleParseContext::parse_paramattr_group_block(const BlockOrRecord &entry)
{
if (!attribute_groups.empty())
{
LOGE("Cannot use multiple group blocks.\n");
return false;
}
for (auto &child : entry.children)
{
if (!child.IsRecord())
continue;
if (AttributeCodes(child.id) != AttributeCodes::GroupCodeEntry)
continue;
if (child.ops.size() < 3)
return false;
uint64_t group_id = child.ops[0];
uint64_t index = child.ops[1];
if (index != ~0u) // Only care about attributes on function scope
continue;
auto &attr_group = attribute_groups[group_id];
size_t i = 2;
size_t count = child.ops.size();
while (i < count)
{
if (child.ops[i] == 0) // Enum attribute, skip 2 values
{
i += 2;
}
else if (child.ops[i] == 1) // Integer attribute, skip 2 or 3 values
{
i++;
if (i >= count)
return false;
switch (AttributeRecord(child.ops[i++]))
{
case AttributeRecord::ALIGNMENT:
case AttributeRecord::STACK_ALIGNMENT:
case AttributeRecord::ALLOC_SIZE:
case AttributeRecord::DEREFERENCEABLE:
case AttributeRecord::DEREFERENCEABLE_OR_NULL:
i++;
break;
default:
break;
}
}
else if (child.ops[i] == 3 || child.ops[i] == 4) // String attribute
{
bool has_value = child.ops[i++] == 4;
String kind, value;
while (child.ops[i] != 0 && i < count)
kind.push_back(char(child.ops[i++]));
if (child.ops[i] != 0)
return false;
i++;
if (has_value)
{
while (child.ops[i] != 0 && i < count)
value.push_back(char(child.ops[i++]));
if (child.ops[i] != 0)
return false;
i++;
}
attr_group.emplace_back(std::move(kind), std::move(value));
}
else if (child.ops[i] == 5 || child.ops[i] == 6) // Value attribute
{
bool has_type = child.ops[i++] == 6;
if (i >= count)
return false;
if (AttributeRecord(child.ops[i++]) == AttributeRecord::BY_VAL && has_type)
i++;
}
else
return false;
}
if (i > count)
return false;
}
return true;
}
bool ModuleParseContext::parse_function_child_block(const BlockOrRecord &entry)
{
switch (KnownBlocks(entry.id))
{
case KnownBlocks::CONSTANTS_BLOCK:
{
for (auto &child : entry.children)
if (!parse_constants_record(child))
return false;
break;
}
case KnownBlocks::METADATA_ATTACHMENT:
{
for (auto &child : entry.children)
if (!parse_metadata_attachment_record(child))
return false;
break;
}
default:
break;
}
return true;
}
static UnaryOperator::UnaryOps translate_uop(UnaryOp op, Type *type)
{
bool is_fp = type->isFloatingPointTy();
if (op == UnaryOp::FNEG && is_fp)
return UnaryOperator::UnaryOps::FNeg;
else
return UnaryOperator::UnaryOps::Invalid;
}
static AtomicRMWInst::BinOp translate_atomic_binop(AtomicBinOp op)
{
switch (op)
{
case AtomicBinOp::RMW_XCHG:
return AtomicRMWInst::BinOp::Xchg;
case AtomicBinOp::RMW_ADD:
return AtomicRMWInst::BinOp::Add;
case AtomicBinOp::RMW_SUB:
return AtomicRMWInst::BinOp::Sub;
case AtomicBinOp::RMW_AND:
return AtomicRMWInst::BinOp::And;
case AtomicBinOp::RMW_NAND:
return AtomicRMWInst::BinOp::Nand;
case AtomicBinOp::RMW_OR:
return AtomicRMWInst::BinOp::Or;
case AtomicBinOp::RMW_XOR:
return AtomicRMWInst::BinOp::Xor;
case AtomicBinOp::RMW_MAX:
return AtomicRMWInst::BinOp::Max;
case AtomicBinOp::RMW_MIN:
return AtomicRMWInst::BinOp::Min;
case AtomicBinOp::RMW_UMAX:
return AtomicRMWInst::BinOp::UMax;
case AtomicBinOp::RMW_UMIN:
return AtomicRMWInst::BinOp::UMin;
case AtomicBinOp::RMW_FADD:
return AtomicRMWInst::BinOp::FAdd;
case AtomicBinOp::RMW_FSUB:
return AtomicRMWInst::BinOp::FSub;
default:
return AtomicRMWInst::BinOp::Invalid;
}
}
bool ModuleParseContext::parse_record(const BlockOrRecord &entry)
{
switch (FunctionRecord(entry.id))
{
case FunctionRecord::DECLAREBLOCKS:
{
if (entry.ops.size() < 1)
return false;
basic_blocks.resize(entry.ops[0]);
basic_block_index = 0;
for (auto &bb : basic_blocks)
bb = context->construct<BasicBlock>(*context);
current_bb = basic_blocks.front();
break;
}
case FunctionRecord::INST_CALL:
{
unsigned index = 1;
if (index >= entry.ops.size())
return false;
auto CCInfo = entry.ops[index++];
if (CCInfo & CALL_FMF_BIT)
{
if (index >= entry.ops.size())
return false;
auto fmf = entry.ops[index++];
(void)fmf;
}
FunctionType *function_type = nullptr;
if (CCInfo & CALL_EXPLICIT_TYPE_BIT)
{
if (index >= entry.ops.size())
return false;
function_type = cast<FunctionType>(get_type(entry.ops[index++]));
}
if (index >= entry.ops.size())
return false;
auto *callee = dyn_cast<Function>(get_value(entry.ops[index++]));
if (!callee)
return false;
if (!function_type)
function_type = callee->getFunctionType();
if (!function_type)
return false;
unsigned num_params = function_type->getNumParams();
if (entry.ops.size() != index + num_params)
{
LOGE("Number of params does not match record.\n");
return false;
}
Vector<Value *> params;
params.reserve(num_params);
for (unsigned i = 0; i < num_params; i++)
{
auto *arg = get_value(entry.ops[index + i], function_type->getParamType(i));
if (!arg)
return false;
params.push_back(arg);
}
auto *value = context->construct<CallInst>(function_type, callee, std::move(params));
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_RET:
{
Value *return_val = !entry.ops.empty() ? get_value(entry.ops[0]) : nullptr;
auto *ret = context->construct<ReturnInst>(return_val);
if (!add_instruction(ret))
return false;
break;
}
case FunctionRecord::INST_UNREACHABLE:
{
auto *ret = context->construct<UnreachableInst>();
if (!add_instruction(ret))
return false;
break;
}
case FunctionRecord::INST_UNOP:
{
unsigned index = 0;
auto val = get_value_and_type(entry.ops, index);
if (!val.first)
return false;
if (index == entry.ops.size())
return false;
auto op = UnaryOp(entry.ops[index++]);
auto *value = context->construct<UnaryOperator>(translate_uop(op, val.second), val.first);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_CMP:
case FunctionRecord::INST_CMP2:
{
unsigned index = 0;
auto lhs = get_value_and_type(entry.ops, index);
if (!lhs.first)
return false;
auto *rhs = get_value(entry.ops, index, lhs.second);
if (index == entry.ops.size())
return false;
auto pred = Instruction::Predicate(entry.ops[index++]);
if (!rhs)
return false;
Instruction *value = nullptr;
if (lhs.second->isFloatingPointTy())
value = context->construct<FCmpInst>(pred, lhs.first, rhs);
else
value = context->construct<ICmpInst>(pred, lhs.first, rhs);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_PHI:
{
if (entry.ops.size() < 1)
return false;
auto *type = get_type(entry.ops[0]);
size_t num_args = (entry.ops.size() - 1) / 2;
auto *phi_node = context->construct<PHINode>(type, num_args);
for (size_t i = 0; i < num_args; i++)
{
Value *value = nullptr;
if (use_relative_id)
value = get_value_signed(entry.ops[2 * i + 1], type);
else
value = get_value(entry.ops[2 * i + 1], type);
BasicBlock *bb = get_basic_block(entry.ops[2 * i + 2]);
if (!value || !bb)
return false;
phi_node->add_incoming(value, bb);
}
if (!add_instruction(phi_node))
return false;
break;
}
case FunctionRecord::INST_BINOP:
{
unsigned index = 0;
auto lhs = get_value_and_type(entry.ops, index);
if (!lhs.first)
return false;
auto *rhs = get_value(entry.ops, index, lhs.second);
if (!lhs.first || !rhs)
return false;
if (index == entry.ops.size())
return false;
auto op = BinOp(entry.ops[index++]);
auto *value = context->construct<BinaryOperator>(lhs.first, rhs, translate_binop(op, lhs.second));
if (index < entry.ops.size())
{
// Only relevant for FP math, but we only look at fast math state for
// FP operations anyways.
auto fast_math_flags = entry.ops[index];
bool fast = (fast_math_flags & (FAST_MATH_UNSAFE_ALGEBRA_BIT | FAST_MATH_ALLOW_CONTRACT_BIT)) != 0;
value->setFast(fast);
}
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_ATOMICRMW:
{
unsigned index = 0;
auto ptr = get_value_and_type(entry.ops, index);
if (!ptr.first || !isa<PointerType>(ptr.second))
return false;
auto *val = get_value(entry.ops, index, ptr.second->getPointerElementType());
if (!val)
return false;
if (index == entry.ops.size())
return false;
AtomicRMWInst::BinOp op = translate_atomic_binop(AtomicBinOp(entry.ops[index++]));
auto *value = context->construct<AtomicRMWInst>(val->getType(), ptr.first, val, op);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_CMPXCHG:
{
unsigned index = 0;
auto ptr = get_value_and_type(entry.ops, index);
auto cmp = get_value_and_type(entry.ops, index);
if (!ptr.first || !cmp.first || !isa<PointerType>(ptr.second))
return false;
auto *new_value = get_value(entry.ops, index, cmp.second);
auto *value = context->construct<AtomicCmpXchgInst>(ptr.first, cmp.first, new_value);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_CAST:
{
unsigned index = 0;
auto input_value = get_value_and_type(entry.ops, index);
if (!input_value.first || index + 2 > entry.ops.size())
return false;
auto *type = get_type(entry.ops[index++]);
if (!type)
return false;
auto op = Instruction::CastOps(translate_castop(CastOp(entry.ops[index++])));
auto *value = context->construct<CastInst>(type, input_value.first, op);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_SELECT:
case FunctionRecord::INST_VSELECT:
{
unsigned index = 0;
auto true_value = get_value_and_type(entry.ops, index);
if (!true_value.first || index + 2 > entry.ops.size())
return false;
auto *false_value = get_value(entry.ops[index++], true_value.second);
auto *cond_value = get_value(entry.ops[index++], Type::getInt1Ty(*context));
if (!false_value || !cond_value)
return false;
auto *value = context->construct<SelectInst>(true_value.first, false_value, cond_value);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_EXTRACTVAL:
{
unsigned index = 0;
auto aggregate = get_value_and_type(entry.ops, index);
if (!aggregate.first)
return false;
if (index == entry.ops.size())
return false;
Vector<unsigned> indices;
indices.reserve(entry.ops.size() - index);
unsigned num_args = entry.ops.size();
Type *type = aggregate.second;
for (; index < num_args; index++)
{
auto element = unsigned(entry.ops[index]);
if (type->getTypeID() == Type::TypeID::StructTyID)
{
if (element >= cast<StructType>(type)->getNumElements())
{
LOGE("Struct element index out of range.\n");
return false;
}
type = cast<StructType>(type)->getElementType(element);
}
else if (type->getTypeID() == Type::TypeID::ArrayTyID)
{
type = type->getArrayElementType();
}
else if (type->getTypeID() == Type::TypeID::VectorTyID)
{
type = cast<VectorType>(type)->getElementType();
}
else
return false;
// DXIL does not support vectors, so we're not supposed to index into them any further.
indices.push_back(element);
}
auto *value = context->construct<ExtractValueInst>(type, aggregate.first, std::move(indices));
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_BR:
{
if (entry.ops.size() < 1)
return false;
auto *true_block = get_basic_block(entry.ops[0]);
if (!true_block)
return false;
if (!add_successor(true_block))
return false;
if (entry.ops.size() == 1)
{
auto *value = context->construct<BranchInst>(true_block);
if (!add_instruction(value))
return false;
}
else if (entry.ops.size() == 3)
{
auto *false_block = get_basic_block(entry.ops[1]);
if (!false_block)
return false;
if (!add_successor(false_block))
return false;
auto *cond = get_value(entry.ops[2], Type::getInt1Ty(*context));
auto *value = context->construct<BranchInst>(true_block, false_block, cond);
if (!add_instruction(value))
return false;
}
else
return false;
break;
}
case FunctionRecord::INST_SWITCH:
{
if (entry.ops.size() < 3)
return false;
auto *type = get_type(entry.ops[0]);
auto *cond = get_value(entry.ops[1]);
auto *default_block = get_basic_block(entry.ops[2]);
if (!type || !cond || !default_block)
return false;
if (!add_successor(default_block))
return false;
unsigned num_cases = (entry.ops.size() - 3) / 2;
auto *inst = context->construct<SwitchInst>(cond, default_block, num_cases);
for (unsigned i = 0; i < num_cases; i++)
{
// For some reason, case values are encoded in absolute terms.
auto *case_value = get_value(entry.ops[3 + 2 * i], type, true);
BasicBlock *bb = get_basic_block(entry.ops[4 + 2 * i]);
if (!case_value || !bb)
{
LOGE("Invalid switch record.\n");
return false;
}
if (!add_successor(bb))
return false;
inst->addCase(case_value, bb);
}
if (!add_instruction(inst))
return false;
break;
}
case FunctionRecord::INST_ALLOCA:
{
if (entry.ops.size() < 3)
return false;
auto *allocated_type = get_type(entry.ops[0]);
auto *type = get_type(entry.ops[1]);
auto *size = get_value(entry.ops[2], nullptr, true);
if (!allocated_type || !type || !size)
return false;
auto *ptr_type = PointerType::get(allocated_type, 0);
auto *value = context->construct<AllocaInst>(ptr_type, type, size);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_GEP:
{
if (entry.ops.size() < 3)
return false;
bool inbounds = entry.ops[0] != 0;
auto *type = get_type(entry.ops[1]);
unsigned count = entry.ops.size();
Vector<Value *> args;
args.reserve(count);
for (unsigned i = 2; i < count;)
{
auto value = get_value_and_type(entry.ops, i);
if (!value.first)
return false;
args.push_back(value.first);
}
type = resolve_gep_element_type(type, args);
if (!type)
return false;
type = PointerType::get(type, cast<PointerType>(args[0]->getType())->getAddressSpace());
auto *value = context->construct<GetElementPtrInst>(type, std::move(args), inbounds);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_LOAD:
{
unsigned index = 0;
auto ptr = get_value_and_type(entry.ops, index);
if (index + 2 != entry.ops.size() && index + 3 != entry.ops.size())
return false;
if (!ptr.first || !isa<PointerType>(ptr.second))
{
LOGE("Loading from something that is not a pointer.\n");
return false;
}
Type *loaded_type = nullptr;
if (index + 3 == entry.ops.size())
loaded_type = get_type(entry.ops[index++]);
else
loaded_type = cast<PointerType>(ptr.second)->getElementType();
auto *value = context->construct<LoadInst>(loaded_type, ptr.first);
add_instruction(value);
break;
}
case FunctionRecord::INST_STORE:
{
unsigned index = 0;
auto ptr = get_value_and_type(entry.ops, index);
auto val = get_value_and_type(entry.ops, index);
if (!ptr.first || !val.first || index + 2 != entry.ops.size())
return false;
auto *value = context->construct<StoreInst>(ptr.first, val.first);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_SHUFFLEVEC:
{
unsigned index = 0;
auto a = get_value_and_type(entry.ops, index);
auto *b = get_value(entry.ops, index, a.second);
auto shuf = get_value_and_type(entry.ops, index);
if (!a.first || !b || !shuf.first || !isa<VectorType>(a.second))
return false;
auto *vec_type = VectorType::get(cast<ConstantDataVector>(shuf.first)->getNumElements(),
cast<VectorType>(a.second)->getElementType());
auto *value = context->construct<ShuffleVectorInst>(vec_type, a.first, b, shuf.first);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_EXTRACTELT:
{
unsigned index = 0;
auto vec = get_value_and_type(entry.ops, index);
if (!vec.first || !isa<VectorType>(vec.second))
return false;
auto element_index = get_value_and_type(entry.ops, index);
if (!element_index.first)
return false;
auto *value = context->construct<ExtractElementInst>(vec.first, element_index.first);
if (!add_instruction(value))
return false;
break;
}
case FunctionRecord::INST_INSERTELT:
{
unsigned index = 0;
auto vec = get_value_and_type(entry.ops, index);
if (!vec.first || !isa<VectorType>(vec.second))
return false;
auto *value = get_value(entry.ops, index, cast<VectorType>(vec.second)->getElementType());
auto element_index = get_value_and_type(entry.ops, index);
if (!value || !element_index.first)
return false;
auto *new_value = context->construct<InsertElementInst>(vec.first, value, element_index.first);
if (!add_instruction(new_value))
return false;
break;
}
default:
LOGE("Unhandled instruction!\n");
return false;
}
return true;
}
bool ModuleParseContext::resolve_forward_references()
{
for (auto *ref : pending_forward_references)
if (!ref->resolve())
return false;
pending_forward_references.clear();
for (auto *bb : basic_blocks)
for (auto &inst : *bb)
if (!inst.resolve_proxy_values())
return false;
return true;
}
bool ModuleParseContext::resolve_global_initializations()
{
for (auto &ref : global_initializations)
{
Value *value = get_value(ref.second, nullptr, true);
if (!value)
return false;
auto *constant_value = dyn_cast<Constant>(value);
if (!constant_value)
{
LOGE("Global initializer is not a constant!\n");
return false;
}
ref.first->set_initializer(constant_value);
}
global_initializations.clear();
return true;
}
bool ModuleParseContext::parse_function_body(const BlockOrRecord &entry)
{
auto global_values = values;
// I think we are supposed to process functions in same order as the module declared them?
if (!seen_first_function_body)
{
std::reverse(functions_with_bodies.begin(), functions_with_bodies.end());
seen_first_function_body = true;
}
if (functions_with_bodies.empty())
{
LOGE("No more functions to process?\n");
return false;
}
function = functions_with_bodies.back();
functions_with_bodies.pop_back();
auto *func_type = function->getFunctionType();
for (unsigned i = 0; i < func_type->getNumParams(); i++)
{
auto *param_type = func_type->getParamType(i);
auto *arg = context->construct<Argument>(param_type, i);
function->add_argument(arg);
add_value(arg);
}
for (auto &child : entry.children)
{
if (child.IsBlock())
{
if (!parse_function_child_block(child))
return false;
}
else
{
if (!parse_record(child))
return false;
}
}
if (!resolve_forward_references())
return false;
if (!resolve_global_initializations())
return false;
function->set_basic_blocks(std::move(basic_blocks));
basic_blocks = {};
basic_block_index = 0;
module->add_function_implementation(function);
values = global_values;
instructions.clear();
return true;
}
bool ModuleParseContext::parse_type(const BlockOrRecord &child)
{
Type *type = nullptr;
switch (TypeRecord(child.id))
{
case TypeRecord::NUMENTRY:
case TypeRecord::STRUCT_NAME:
return true;
case TypeRecord::VOID_TYPE:
type = Type::getVoidTy(*context);
break;
case TypeRecord::HALF:
type = Type::getHalfTy(*context);
break;
case TypeRecord::FLOAT:
type = Type::getFloatTy(*context);
break;
case TypeRecord::DOUBLE:
type = Type::getDoubleTy(*context);
break;
case TypeRecord::POINTER:
{
if (child.ops.size() < 2)
return false;
auto *pointee_type = get_type(child.ops[0]);
if (!pointee_type)
return false;
type = PointerType::get(pointee_type, child.ops[1]);
break;
}
case TypeRecord::ARRAY:
{
if (child.ops.size() < 2)
return false;
auto *elem_type = get_type(child.ops[1]);
if (!elem_type)
return false;
type = ArrayType::get(elem_type, child.ops[0]);
break;
}
case TypeRecord::INTEGER:
{
if (child.ops.size() < 1)
return false;
auto bit_width = child.ops[0];
if (bit_width <= 64)
type = Type::getIntTy(*context, unsigned(bit_width));
else
return false;
break;
}
case TypeRecord::STRUCT_NAMED:
case TypeRecord::STRUCT_ANON:
{
if (child.ops.size() < 1)
return false;
Vector<Type *> members;
unsigned num_members = child.ops.size() - 1;
members.reserve(num_members);
for (unsigned i = 0; i < num_members; i++)
members.push_back(get_type(child.ops[i + 1]));
type = StructType::get(*context, std::move(members));
break;
}
case TypeRecord::VECTOR:
{
if (child.ops.size() < 2)
return false;
auto *elem_type = get_type(child.ops[1]);
if (!elem_type)
return false;
type = VectorType::get(child.ops[0], elem_type);
break;
}
case TypeRecord::FUNCTION:
{
if (child.ops.size() < 2)
return false;
Vector<Type *> argument_types;
argument_types.reserve(child.ops.size() - 2);
for (size_t i = 2; i < child.ops.size(); i++)
argument_types.push_back(get_type(child.ops[i]));
auto *func_type = get_type(child.ops[1]);
if (!func_type)
return false;
type = context->construct<FunctionType>(*context, func_type, std::move(argument_types));
break;
}
case TypeRecord::LABEL:
{
type = Type::getLabelTy(*context);
break;
}
case TypeRecord::METADATA:
{
type = Type::getMetadataTy(*context);
break;
}
case TypeRecord::OPAQUE_TYPE:
{
type = Type::getOpaqueTy(*context);
break;
}
default:
LOGE("Unknown type!\n");
return false;
}
add_type(type);
return true;
}
bool ModuleParseContext::parse_types(const BlockOrRecord &entry)
{
for (auto &child : entry.children)
if (!parse_type(child))
return false;
return true;
}
bool ModuleParseContext::parse_value_symtab(const BlockOrRecord &entry)
{
for (auto &symtab : entry.children)
{
switch (ValueSymtabRecord(symtab.id))
{
case ValueSymtabRecord::ENTRY:
{
if (symtab.ops.size() < 1)
return false;
auto name = symtab.getString(1);
module->add_value_name(symtab.ops[0], name);
break;
}
default:
break;
}
}
return true;
}
static GlobalVariable::LinkageTypes decode_linkage(uint64_t v)
{
switch (v)
{
case 0:
case 5:
case 6:
case 15:
return GlobalVariable::ExternalLinkage;
case 2:
return GlobalVariable::AppendingLinkage;
default:
return GlobalVariable::InternalLinkage;
}
}
bool ModuleParseContext::parse_global_variable_record(const BlockOrRecord &entry)
{
if (use_strtab)
{
LOGE("Unknown module code 2 which uses strtab.\n");
return false;
}
if (entry.ops.size() < 4)
return false;
auto *type = get_type(entry.ops[0]);
bool is_const = (entry.ops[1] & 1) != 0;
bool explicit_type = (entry.ops[1] & 2) != 0;
unsigned address_space = 0;
if (explicit_type)
address_space = entry.ops[1] >> 2;
else
{
address_space = cast<PointerType>(type)->getAddressSpace();
type = cast<PointerType>(type)->getElementType();
}
if (!type)
return false;
auto linkage = decode_linkage(entry.ops[3]);
auto *value = context->construct<GlobalVariable>(PointerType::get(type, address_space), linkage, is_const);
module->add_global_variable(value);
add_value(value);
uint64_t init_id = entry.ops[2];
if (init_id != 0)
global_initializations.push_back({ value, init_id - 1 });
return true;
}
bool ModuleParseContext::parse_function_record(const BlockOrRecord &entry)
{
if (use_strtab)
{
LOGE("Unknown module code 2 which uses strtab.\n");
return false;
}
if (entry.ops.size() < 3)
return false;
auto *type = get_type(entry.ops[0]);
if (!type)
return false;
// Calling convention is [1], not relevant.
bool is_proto = entry.ops[2];
// Lots of other irrelevant arguments ...
auto *func_type = dyn_cast<FunctionType>(type);
if (!func_type)
func_type = cast<FunctionType>(cast<PointerType>(type)->getElementType());
if (!func_type)
return false;
auto id = values.size();
auto *func = context->construct<Function>(func_type, id, *module);
if (entry.ops.size() >= 5 && entry.ops[4] != 0 && (entry.ops[4] - 1) < attribute_lists.size())
func->set_attributes(attribute_lists[entry.ops[4] - 1]);
values.push_back(func);
if (!is_proto)
functions_with_bodies.push_back(func);
return true;
}
bool ModuleParseContext::parse_version_record(const BlockOrRecord &entry)
{
if (entry.ops.size() < 1)
return false;
unsigned version = entry.ops[0];
use_relative_id = version >= 1;
use_strtab = version >= 2;
return true;
}
Type *ModuleParseContext::get_type(uint64_t index)
{
if (index >= types.size())
return nullptr;
return types[index];
}
bool ModuleParseContext::add_type(Type *type)
{
types.push_back(type);
return true;
}
void Module::add_value_name(uint64_t id, const String &name)
{
value_symtab[id] = name;
}
void Module::add_function_implementation(Function *func)
{
functions.push_back(func);
}
void Module::add_global_variable(GlobalVariable *variable)
{
globals.push_back(variable);
}
void Module::add_named_metadata(const String &name, NamedMDNode *node)
{
named_metadata[name] = node;
}
void Module::add_unnamed_metadata(MDNode *node)
{
unnamed_metadata.push_back(node);
}
Function *Module::getFunction(const String &name) const
{
auto itr =
std::find_if(functions.begin(), functions.end(), [&](const Function *func) { return func->getName() == name; });
if (itr != functions.end())
return *itr;
else
return nullptr;
}
NamedMDNode *Module::getNamedMetadata(const String &name) const
{
auto itr = named_metadata.find(name);
if (itr != named_metadata.end())
return itr->second;
else
return nullptr;
}
static const String empty_string;
const String &Module::get_value_name(uint64_t id) const
{
auto itr = value_symtab.find(id);
if (itr != value_symtab.end())
return itr->second;
else
return empty_string;
}
LLVMContext &Module::getContext()
{
return context;
}
Module::Module(LLVMContext &context_)
: context(context_)
{
}
Vector<Function *>::const_iterator Module::begin() const
{
return functions.begin();
}
Vector<Function *>::const_iterator Module::end() const
{
return functions.end();
}
IteratorAdaptor<GlobalVariable, Vector<GlobalVariable *>::const_iterator> Module::global_begin() const
{
return globals.begin();
}
IteratorAdaptor<GlobalVariable, Vector<GlobalVariable *>::const_iterator> Module::global_end() const
{
return globals.end();
}
UnorderedMap<String, NamedMDNode *>::const_iterator Module::named_metadata_begin() const
{
return named_metadata.begin();
}
UnorderedMap<String, NamedMDNode *>::const_iterator Module::named_metadata_end() const
{
return named_metadata.end();
}
Vector<MDNode *>::const_iterator Module::unnamed_metadata_begin() const
{
return unnamed_metadata.begin();
}
Vector<MDNode *>::const_iterator Module::unnamed_metadata_end() const
{
return unnamed_metadata.end();
}
Module *parseIR(LLVMContext &context, const void *data, size_t size)
{
LLVMBC::BitcodeReader reader(static_cast<const uint8_t *>(data), size);
auto toplevel = reader.ReadToplevelBlock();
// The top-level block must be MODULE_BLOCK.
if (KnownBlocks(toplevel.id) != KnownBlocks::MODULE_BLOCK)
return nullptr;
// We should have consumed all bits, only one top-level block.
if (!reader.AtEndOfStream())
return nullptr;
auto *module = context.construct<Module>(context);
ModuleParseContext parse_context;
parse_context.module = module;
parse_context.context = &module->getContext();
for (auto &child : toplevel.children)
{
if (child.IsBlock())
{
switch (KnownBlocks(child.id))
{
case KnownBlocks::VALUE_SYMTAB_BLOCK:
if (!parse_context.parse_value_symtab(child))
return nullptr;
break;
case KnownBlocks::FUNCTION_BLOCK:
if (!parse_context.parse_function_body(child))
return nullptr;
break;
case KnownBlocks::TYPE_BLOCK:
if (!parse_context.parse_types(child))
return nullptr;
break;
case KnownBlocks::CONSTANTS_BLOCK:
if (!parse_context.parse_constants_block(child))
return nullptr;
break;
case KnownBlocks::METADATA_BLOCK:
if (!parse_context.parse_metadata_block(child))
return nullptr;
break;
case KnownBlocks::PARAMATTR_BLOCK:
if (!parse_context.parse_paramattr_block(child))
return nullptr;
break;
case KnownBlocks::PARAMATTR_GROUP_BLOCK:
if (!parse_context.parse_paramattr_group_block(child))
return nullptr;
break;
default:
break;
}
}
else
{
switch (ModuleRecord(child.id))
{
case ModuleRecord::VERSION:
if (!parse_context.parse_version_record(child))
return nullptr;
break;
case ModuleRecord::FUNCTION:
if (!parse_context.parse_function_record(child))
return nullptr;
break;
case ModuleRecord::GLOBAL_VARIABLE:
if (!parse_context.parse_global_variable_record(child))
return nullptr;
break;
default:
break;
}
}
}
return module;
}
} // namespace LLVMBC
================================================
FILE: bc/module.hpp
================================================
/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#pragma once
namespace dxbc_spv
{
namespace ir
{
class Builder;
}
}
#include "data_structures.hpp"
#include "iterator.hpp"
#include <exception>
#include <stddef.h>
#include <type_traits>
#include <utility>
// A reasonably small LLVM C++ API lookalike.
#define llvm LLVMBC
namespace LLVMBC
{
class Function;
class LLVMContext;
class Type;
class Instruction;
class Function;
class BasicBlock;
class GlobalVariable;
class NamedMDNode;
class MDNode;
class Module
{
public:
explicit Module(LLVMContext &context);
LLVMContext &getContext();
NamedMDNode *getNamedMetadata(const String &name) const;
Function *getFunction(const String &name) const;
void add_value_name(uint64_t id, const String &name);
void add_function_implementation(Function *func);
void add_global_variable(GlobalVariable *variable);
void add_named_metadata(const String &name, NamedMDNode *node);
void add_unnamed_metadata(MDNode *node);
const String &get_value_name(uint64_t id) const;
Vector<Function *>::const_iterator begin() const;
Vector<Function *>::const_iterator end() const;
IteratorAdaptor<GlobalVariable, Vector<GlobalVariable *>::const_iterator> global_begin() const;
IteratorAdaptor<GlobalVariable, Vector<GlobalVariable *>::const_iterator> global_end() const;
UnorderedMap<String, NamedMDNode *>::const_iterator named_metadata_begin() const;
UnorderedMap<String, NamedMDNode *>::const_iterator named_metadata_end() const;
Vector<MDNode *>::const_iterator unnamed_metadata_begin() const;
Vector<MDNode *>::const_iterator unnamed_metadata_end() const;
private:
LLVMContext &context;
Vector<Function *> functions;
Vector<GlobalVariable *> globals;
UnorderedMap<uint64_t, String> value_symtab;
UnorderedMap<String, NamedMDNode *> named_metadata;
Vector<MDNode *> unnamed_metadata;
};
Module *parseIR(LLVMContext &context, const void *data, size_t size);
Module *parseDXBCIR(LLVMContext &context, dxbc_spv::ir::Builder &builder);
Module *parseDXBCBinary(LLVMContext &context, const void *data, size_t size);
bool disassemble(Module &module, String &str);
} // namespace LLVMBC
================================================
FILE: bc/module_dxbc_ir.cpp
================================================
/* Copyright (c) 2025 Hans-Kristian Arntzen for Valve Corporation
*
* SPDX-License-Identifier: MIT
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "module.hpp"
#include "context.hpp"
#include "metadata.hpp"
#include "cast.hpp"
#include "function.hpp"
#include "instruction.hpp"
#include <array>
#include "../dxil.hpp"
#include <assert.h>
// dxbc-spirv
#include "ir/ir.h"
#include "ir/ir_builder.h"
#include "dxbc/dxbc_api.h"
#include "util/util_log.h"
using namespace dxbc_spv;
class ScopedLogger : util::Logger
{
public:
virtual void message(util::LogLevel severity, const char* text)
{
switch (severity)
{
case util::LogLevel::eDebug:
case util::LogLevel::eInfo: LOGI("%s\n", text); break;
case util::LogLevel::eWarn: LOGW("%s\n", text); break;
case util::LogLevel::eError: LOGE("%s\n", text); break;
}
}
virtual util::LogLevel getMinimumSeverity()
{
return util::LogLevel::eInfo;
}
};
namespace LLVMBC
{
template <typename Func>
static void for_all_opcodes(ir::Builder &builder, ir::OpCode opcode, const Func &func)
{
for (auto &op : builder)
if (op.getOpCode() == opcode)
if (!func(op))
return;
}
static const char *shader_stage_to_meta(ir::ShaderStage stage)
{
switch (stage)
{
case ir::ShaderStage::eVertex:
return "vs";
case ir::ShaderStage::eHull:
return "hs";
case ir::ShaderStage::eDomain:
return "ds";
case ir::ShaderStage::eGeometry:
return "gs";
case ir::ShaderStage::ePixel:
return "ps";
case ir::ShaderStage::eCompute:
return "cs";
default:
return "";
}
}
static DXIL::InputPrimitive convert_input_primitive_type(ir::PrimitiveType type)
{
switch (type)
{
case ir::PrimitiveType::eLines:
return DXIL::InputPrimitive::Line;
case ir::PrimitiveType::eLinesAdj:
return DXIL::InputPrimitive::LineWithAdjacency;
case ir::PrimitiveType::ePoints:
return DXIL::InputPrimitive::Point;
case ir::PrimitiveType::eTriangles:
return DXIL::InputPrimitive::Triangle;
case ir::PrimitiveType::eTrianglesAdj:
return DXIL::InputPrimitive::TriangleWithAdjaceny;
default:
return DXIL::InputPrimitive::Undefined;
}
}
static DXIL::PrimitiveTopology convert_output_primitive_type(ir::PrimitiveType type)
{
switch (type)
{
case ir::PrimitiveType::eLines:
return DXIL::PrimitiveTopology::LineStrip;
case ir::PrimitiveType::ePoints:
return DXIL::PrimitiveTopology::PointList;
case ir::PrimitiveType::eTriangles:
return DXIL::PrimitiveTopology::TriangleStrip;
default:
return DXIL::PrimitiveTopology::Undefined;
}
}
static DXIL::ResourceKind convert_resource_kind(ir::ResourceKind kind)
{
switch (kind)
{
case ir::ResourceKind::eBufferRaw:
return DXIL::ResourceKind::RawBuffer;
case ir::ResourceKind::eBufferStructured:
return DXIL::ResourceKind::StructuredBuffer;
case ir::ResourceKind::eBufferTyped:
return DXIL::ResourceKind::TypedBuffer;
case ir::ResourceKind::eImage1D:
return DXIL::ResourceKind::Texture1D;
case ir::ResourceKind::eImage1DArray:
return DXIL::ResourceKind::Texture1DArray;
case ir::ResourceKind::eImage2D:
return DXIL::ResourceKind::Texture2D;
case ir::ResourceKind::eImage2DArray:
return DXIL::ResourceKind::Texture2DArray;
case ir::ResourceKind::eImage3D:
return DXIL::ResourceKind::Texture3D;
case ir::ResourceKind::eImageCube:
return DXIL::ResourceKind::TextureCube;
case ir::ResourceKind::eImageCubeArray:
return DXIL::ResourceKind::TextureCubeArray;
case ir::ResourceKind::eImage2DMS:
return DXIL::ResourceKind::Texture2DMS;
case ir::ResourceKind::eImage2DMSArray:
return DXIL::ResourceKind::Texture2DMSArray;
default:
LOGE("Unrecognized resource kind %d\n", int(kind));
return DXIL::ResourceKind::Invalid;
}
}
static DXIL::Op convert_builtin_opcode(ir::BuiltIn builtin)
{
switch (builtin)
{
case ir::BuiltIn::eSampleCount:
return DXIL::Op::RenderTargetGetSampleCount;
case ir::BuiltIn::eLocalThreadIndex:
return DXIL::Op::FlattenedThreadIdInGroup;
case ir::BuiltIn::eIsFullyCovered:
return DXIL::Op::InnerCoverage;
case ir::BuiltIn::eGsInstanceId:
return DXIL::Op::GSInstanceID;
case ir::BuiltIn::ePrimitiveId:
return DXIL::Op::PrimitiveID;
case ir::BuiltIn::eTessControlPointId:
return DXIL::Op::OutputControlPointID;
case ir::BuiltIn::eTessControlPointCountIn:
return DXIL::Op::ExtendedSpirvControlPointCountIn;
default:
return DXIL::Op::Count;
}
}
static DXIL::Semantic convert_semantic(ir::BuiltIn builtin)
{
switch (builtin)
{
case ir::BuiltIn::ePosition:
return DXIL::Semantic::Position;
case ir::BuiltIn::eClipDistance:
return DXIL::Semantic::ClipDistance;
case ir::BuiltIn::eCullDistance:
return DXIL::Semantic::CullDistance;
case ir::BuiltIn::eVertexId:
return DXIL::Semantic::VertexID;
case ir::BuiltIn::eInstanceId:
return DXIL::Semantic::InstanceID;
case ir::BuiltIn::ePrimitiveId:
return DXIL::Semantic::PrimitiveID;
case ir::BuiltIn::eLayerIndex:
return DXIL::Semantic::RenderTargetArrayIndex;
case ir::BuiltIn::eViewportIndex:
return DXIL::Semantic::ViewPortArrayIndex;
case ir::BuiltIn::eGsInstanceId:
return DXIL::Semantic::GSInstanceID;
case ir::BuiltIn::eTessControlPointId:
return DXIL::Semantic::OutputControlPointID;
case ir::BuiltIn::eTessCoord:
return DXIL::Semantic::DomainLocation;
case ir::BuiltIn::eTessFactorInner:
return DXIL::Semantic::InsideTessFactor;
case ir::BuiltIn::eTessFactorOuter:
return DXIL::Semantic::TessFactor;
case ir::BuiltIn::eSampleId:
return DXIL::Semantic::SampleIndex;
case ir::BuiltIn::eSampleMask:
return DXIL::Semantic::Coverage;
case ir::BuiltIn::eIsFrontFace:
return DXIL::Semantic::IsFrontFace;
case ir::BuiltIn::eDepth:
return DXIL::Semantic::Depth;
case ir::BuiltIn::eStencilRef:
return DXIL::Semantic::StencilRef;
case ir::BuiltIn::eGlobalThreadId:
return DXIL::Semantic::DispatchThreadID;
case ir::BuiltIn::eLocalThreadId:
return DXIL::Semantic::GroupThreadID;
case ir::BuiltIn::eWorkgroupId:
return DXIL::Semantic::GroupID;
default:
return DXIL::Semantic::User;
}
}
static DXIL::InterpolationMode convert_interpolation_mode(ir::InterpolationMode mode)
{
switch (mode)
{
case ir::InterpolationMode::eCentroid:
return DXIL::InterpolationMode::LinearCentroid;
case ir::InterpolationMode::eNoPerspective:
return DXIL::InterpolationMode::LinearNoperspective;
case ir::InterpolationMode::eFlat:
return DXIL::InterpolationMode::Constant;
case ir::InterpolationMode::eSample:
return DXIL::InterpolationMode::LinearSample;
default:
return DXIL::InterpolationMode::Undefined;
}
}
static DXIL::AtomicBinOp convert_atomic_binop(ir::AtomicOp binop)
{
switch (binop)
{
case ir::AtomicOp::eAdd:
case ir::AtomicOp::eInc:
return DXIL::AtomicBinOp::IAdd;
case ir::AtomicOp::eAnd:
return DXIL::AtomicBinOp::And;
case ir::AtomicOp::eOr:
return DXIL::AtomicBinOp::Or;
case ir::AtomicOp::eXor:
return DXIL::AtomicBinOp::Xor;
case ir::AtomicOp::eExchange:
return DXIL::AtomicBinOp::Exchange;
case ir::AtomicOp::eSMax:
return DXIL::AtomicBinOp::IMax;
case ir::AtomicOp::eSMin:
return DXIL::AtomicBinOp::IMin;
case ir::AtomicOp::eUMax:
return DXIL::AtomicBinOp::UMax;
case ir::AtomicOp::eUMin:
return DXIL::AtomicBinOp::UMin;
case ir::AtomicOp::eSub:
case ir::AtomicOp::eDec:
return DXIL::AtomicBinOp::Sub;
case ir::AtomicOp::eLoad:
return DXIL::AtomicBinOp::Load;
case ir::AtomicOp::eStore:
return DXIL::AtomicBinOp::Store;
default:
return DXIL::AtomicBinOp::Invalid;
}
}
static AtomicRMWInst::BinOp convert_atomic_binop_llvm(ir::AtomicOp binop)
{
switch (binop)
{
case ir::AtomicOp::eAdd:
case ir::AtomicOp::eInc:
return AtomicRMWInst::BinOp::Add;
case ir::AtomicOp::eAnd:
return AtomicRMWInst::BinOp::And;
case ir::AtomicOp::eOr:
return AtomicRMWInst::BinOp::Or;
case ir::AtomicOp::eXor:
return AtomicRMWInst::BinOp::Xor;
case ir::AtomicOp::eExchange:
return AtomicRMWInst::BinOp::Xchg;
case ir::AtomicOp::eSMax:
return AtomicRMWInst::BinOp::Max;
case ir::AtomicOp::eSMin:
return AtomicRMWInst::BinOp::Min;
case ir::AtomicOp::eUMax:
return AtomicRMWInst::BinOp::UMax;
case ir::AtomicOp::eUMin:
return AtomicRMWInst::BinOp::UMin;
case ir::AtomicOp::eSub:
case ir::AtomicOp::eDec:
return AtomicRMWInst::BinOp::Sub;
case ir::AtomicOp::eLoad:
return AtomicRMWInst::BinOp::Or;
case ir::AtomicOp::eStore:
return AtomicRMWInst::BinOp::Xchg;
default:
return AtomicRMWInst::BinOp::Invalid;
}
}
static DXIL::Op convert_round_mode(ir::RoundMode mode)
{
switch (mode)
{
case ir::RoundMode::ePositiveInf:
return DXIL::Op::Round_pi;
case ir::RoundMode::eNegativeInf:
return DXIL::Op::Round_ni;
case ir::RoundMode::eZero:
return DXIL::Op::Round_z;
default:
return DXIL::Op::Round_ne;
}
}
struct ComponentMapping
{
DXIL::ComponentType type = DXIL::ComponentType::Invalid;
uint32_t num_rows = 1;
uint32_t num_cols = 1;
};
static ComponentMapping convert_component_mapping(const ir::Type &type, bool need_axis)
{
ComponentMapping mapping = {};
switch (type.getBaseType(0).getBaseType())
{
case ir::ScalarType::eF16:
mapping.type = DXIL::ComponentType::F16;
break;
case ir::ScalarType::eI16:
mapping.type = DXIL::ComponentType::I16;
break;
case ir::ScalarType::eU16:
mapping.type = DXIL::ComponentType::U16;
break;
case ir::ScalarType::eF32:
mapping.type = DXIL::ComponentType::F32;
break;
case ir::ScalarType::eI32:
mapping.type = DXIL::ComponentType::I32;
break;
case ir::ScalarType::eU32:
mapping.type = DXIL::ComponentType::U32;
break;
case ir::ScalarType::eF64:
mapping.type = DXIL::ComponentType::F64;
break;
case ir::ScalarType::eI64:
mapping.type = DXIL::ComponentType::I64;
break;
case ir::ScalarType::eU64:
mapping.type = DXIL::ComponentType::U64;
break;
case ir::ScalarType::eBool:
mapping.type = DXIL::ComponentType::I1;
break;
default:
LOGE("Unrecognized component type.\n");
break;
}
if (need_axis)
{
// Strip the outermost dimension.
if (type.getArrayDimensions() >= 2)
mapping.num_rows = type.getArraySize(type.getArrayDimensions() - 2);
}
else if (type.isArrayType())
{
mapping.num_rows = type.getArraySize(0);
if (type.getArrayDimensions() != 1)
LOGE("Unexpected number of array dimensions.\n");
}
mapping.num_cols = type.getBaseType(0).getVectorSize();
return mapping;
}
static DXIL::TessellatorDomain convert_hull_domain(ir::PrimitiveType type)
{
switch (type)
{
case ir::PrimitiveType::eTriangles:
return DXIL::TessellatorDomain::Tri;
case ir::PrimitiveType::eQuads:
return DXIL::TessellatorDomain::Quad;
case ir::PrimitiveType::eLines:
return DXIL::TessellatorDomain::IsoLine;
default:
return DXIL::TessellatorDomain::Undefined;
}
}
static DXIL::TessellatorPartitioning convert_hull_partitioning(ir::TessPartitioning part)
{
switch (part)
{
case ir::TessPartitioning::eInteger:
return DXIL::TessellatorPartitioning::Integer;
case ir::TessPartitioning::eFractEven:
return DXIL::TessellatorPartitioning::FractionalEven;
case ir::TessPartitioning::eFractOdd:
return DXIL::TessellatorPartitioning::FractionalOdd;
default:
return DXIL::TessellatorPartitioning::Undefined;
}
}
static DXIL::TessellatorOutputPrimitive convert_hull_output_primitive(ir::PrimitiveType type, ir::TessWindingOrder winding)
{
switch (type)
{
case ir::PrimitiveType::eTriangles:
return winding == ir::TessWindingOrder::eCw ?
DXIL::TessellatorOutputPrimitive::TriangleCW :
DXIL::TessellatorOutputPrimitive::TriangleCCW;
case ir::PrimitiveType::eLines:
return DXIL::TessellatorOutputPrimitive::Line;
case ir::PrimitiveType::ePoints:
return DXIL::TessellatorOutputPrimitive::Point;
default:
return DXIL::TessellatorOutputPrimitive::Undefined;
}
}
struct DXILIntrinsicTable
{
struct FunctionOverload
{
Function *func;
// Either overloaded on return type, or the primary argument for e.g. stores.
Type *overload_type;
};
struct FunctionEntry
{
// At most should be overload for i32/u32/f32 x 16/32/64
std::array<FunctionOverload, 9> overloads;
unsigned num_overloads;
};
FunctionEntry intrinsic_functions[int(DXIL::Op::Count)] = {};
Function *get(Module &module, DXIL::Op op,
Type *return_type,
const Vector<Type *> &argument_types,
Type *overload_type, uint64_t &tween);
};
Function *DXILIntrinsicTable::get(
Module &module, DXIL::Op op,
Type *return_type, const Vector<Type *> &argument_types,
Type *overload_type, uint64_t &tween)
{
auto &entry = intrinsic_functions[int(op)];
for (unsigned i = 0; i < entry.num_overloads; i++)
if (entry.overloads[i].overload_type == overload_type)
return entry.overloads[i].func;
auto &context = module.getContext();
assert(entry.num_overloads < entry.overloads.size());
auto *func_type = context.construct<FunctionType>(context, return_type, argument_types);
auto *func = context.construct<Function>(func_type, ++tween, module);
// TODO: Can have a look-up for expected intrinsics name.
module.add_value_name(tween, "dx.op.intrinsic");
entry.overloads[entry.num_overloads++] = { func, overload_type };
return func;
}
class ParseContext
{
public:
ParseContext(LLVMContext &context_, ir::Builder &builder_, Module &module_)
: context(context_), builder(builder_), module(module_) {}
bool emit_metadata();
bool emit_entry_point();
bool emit_function_bodies();
private:
LLVMContext &context;
ir::Builder &builder;
Module &module;
uint64_t metadata_tween_id = 0;
uint64_t tween_id = 0;
ir::ShaderStage shader_stage = {};
ConstantInt *get_constant_uint(uint32_t value);
// Metadata wrangling
ConstantAsMetadata *create_constant_uint_meta(uint32_t value);
ConstantAsMetadata *create_constant_uint64_meta(uint32_t value);
MDString *create_string_meta(const String &str);
ConstantAsMetadata *create_constant_meta(Constant *c);
template <typename... Ops>
MDNode *create_md_node(Ops&&... ops)
{
Vector<MDOperand *> vops { std::forward<Ops>(ops)... };
return create_md_node(std::move(vops));
}
void create_named_md_node(const String &name, MDNode *node);
MDNode *create_md_node(Vector<MDOperand *> ops);
MDOperand *create_entry_point_meta(llvm::Function *patch_control_func);
MDNode *create_stage_io_meta();
MDOperand *create_null_meta();
void set_function_attributes(Function *func);
struct MetadataMapping
{
Vector<MDOperand *> nodes;
};
MetadataMapping srvs, uavs, cbvs, samplers, inputs, outputs, patches;
uint32_t build_texture_srv(uint32_t space, uint32_t index, uint32_t size,
DXIL::ResourceKind kind,
DXIL::ComponentType type);
uint32_t build_texture_uav(uint32_t space, uint32_t index, uint32_t size,
DXIL::ResourceKind kind,
DXIL::ComponentType type, bool coherent, bool rov);
uint32_t build_buffer_uav(uint32_t space, uint32_t index, uint32_t size,
DXIL::ResourceKind kind, uint32_t stride,
bool coherent, bool counter, bool rov);
uint32_t build_buffer_srv(uint32_t space, uint32_t index, uint32_t size,
DXIL::ResourceKind kind, uint32_t stride);
uint32_t build_cbv(uint32_t space, uint32_t index, uint32_t size, uint32_t cbv_size);
uint32_t build_sampler(uint32_t space, uint32_t index, uint32_t size);
uint32_t build_stage_io(MetadataMapping &mapping, ir::SsaDef ssa, const String &name,
DXIL::ComponentType type,
DXIL::Semantic semantic,
uint32_t semantic_index,
DXIL::InterpolationMode interpolation,
uint32_t rows, uint32_t cols,
uint32_t start_row, uint32_t start_col,
uint32_t stream,
bool need_axis);
// DXIL intrinsic build.
DXILIntrinsicTable dxil_intrinsics;
template <typename... Values>
Instruction *build_dxil_call(DXIL::Op op, Type *return_type, Type *overload_type, Values&&... values);
Instruction *build_dxil_call(DXIL::Op op, Type *return_type, Type *overload_type, Vector<Value *> values);
// Resource access hell.
Instruction *build_load_input(
uint32_t index, Type *type,
Value *row, uint32_t col, Value *axis, bool patch);
Instruction *build_load_output(
uint32_t index, Type *type,
Value *row, uint32_t col, Value *axis, bool patch);
Instruction *build_store_output(uint32_t index, Value *row, uint32_t col, Value *value, bool patch);
Instruction *build_load_builtin(DXIL::Op opcode, ir::SsaDef addr);
Instruction *build_descriptor_load(ir::SsaDef resource, ir::SsaDef index, bool nonuniform);
bool build_input_load(const ir::Op &op);
bool build_output_load(const ir::Op &op);
bool build_output_store(const ir::Op &op);
bool build_gep_load(const ir::Op &op);
bool build_gep_store(const ir::Op &op);
bool build_composite_construct(const ir::Op &op);
bool build_composite_extract(const ir::Op &op);
bool build_composite_insert(const ir::Op &op);
bool build_descriptor_load(const ir::Op &op);
bool build_buffer_load(const ir::Op &op);
bool build_buffer_load_cbv(const ir::Op &op);
bool build_buffer_load(const ir::Op &op, DXIL::ResourceKind kind);
bool build_buffer_load_return_composite(const ir::Op &op, Value *value);
Instruction *build_extract_composite(const ir::Op &op, Value *value, unsigned num_elements);
bool build_buffer_query_size(const ir::Op &op);
bool build_buffer_store(const ir::Op &op);
bool build_buffer_store(const ir::Op &op, DXIL::ResourceKind kind);
bool build_buffer_atomic(const ir::Op &op);
bool build_lds_atomic(const ir::Op &op);
bool build_buffer_atomic_binop(const ir::Op &op, DXIL::ResourceKind kind);
bool build_counter_atomic(const ir::Op &op);
bool build_image_load(const ir::Op &op);
bool build_image_store(const ir::Op &op);
bool build_image_atomic(const ir::Op &op);
bool build_image_query_size(const ir::Op &op);
bool build_image_query_mips_samples(const ir::Op &op);
bool build_image_sample(const ir::Op &op);
bool build_image_gather(const ir::Op &op);
bool build_image_compute_lod(const ir::Op &op);
bool build_deriv(const ir::Op &op);
bool build_check_sparse_access(const ir::Op &op);
bool build_fround(const ir::Op &op);
bool build_frcp(const ir::Op &op);
bool build_binary_op(const ir::Op &op, BinaryOperator::BinaryOps binop);
bool build_interpolate_at_centroid(const ir::Op &op);
bool build_interpolate_at_sample(const ir::Op &op);
bool build_interpolate_at_offset(const ir::Op &op);
bool build_barrier(const ir::Op &op);
bool build_demote(const ir::Op &op);
template <DXIL::Op dxop>
bool build_dxil_unary(const ir::Op &op);
template <DXIL::Op dxop>
bool build_dxil_constant_unary(const ir::Op &op);
template <DXIL::Op dxop>
bool build_dxil_binary(const ir::Op &op);
template <DXIL::Op dxop>
bool build_dxil_trinary(const ir::Op &op);
template <DXIL::Op dxop>
bool build_dxil_quaternary(const ir::Op &op);
Value *get_extracted_composite_component(Value *value, unsigned component);
Value *get_constant_mul(Value *value, uint32_t scale);
// BasicBlock emission.
BasicBlock *current_bb = nullptr;
void push_instruction(Instruction *instruction, ir::SsaDef ssa = {});
bool push_instruction(const ir::Op &op);
// ir::Builder helpers.
// Need ways to translate between ir::SsaDef <-> LLVM values for the most part.
UnorderedMap<ir::SsaDef, Function *> function_map;
UnorderedMap<ir::SsaDef, BasicBlock *> bb_map;
UnorderedMap<ir::SsaDef, Type *> param_types;
Vector<std::pair<ir::SsaDef, Type *>> params;
UnorderedMap<ir::SsaDef, Value *> value_map;
// Maps stage IO and resources since we need to resolve them back to type + metadata index
// when loading descriptor.
struct StageIOHandler
{
uint32_t index = UINT32_MAX;
DXIL::Op op = DXIL::Op::Count;
bool need_axis = false;
};
UnorderedMap<ir::SsaDef, StageIOHandler> stage_io_map;
struct StageIOAccess
{
Value *axis;
Value *row;
uint32_t col;
};
StageIOAccess build_stage_io_access(const StageIOHandler &handler, ir::SsaDef io_decl, ir::SsaDef addr);
struct ResourceHandler
{
DXIL::ResourceType resource_type;
DXIL::ResourceKind resource_kind;
uint32_t index;
uint32_t binding_offset; // DXIL is weird.
};
UnorderedMap<ir::SsaDef, ResourceHandler> resource_map;
Type *convert_type(const ir::Type &type);
BasicBlock *get_basic_block(ir::SsaDef ssa);
Value *get_value(const ir::Operand &op) const;
Value *get_value(const ir::SsaDef &op) const;
bool emit_constant(const ir::Op &op);
ir::OpFlags global_fp_flags = {};
};
static inline Type *get_value_type(Value *value)
{
assert(value);
return value->getType();
}
static Type *get_scalar_type(Type *type)
{
if (auto *vec = dyn_cast<VectorType>(type))
return vec->getElementType();
else if (isa<StructType>(type))
return type->getStructElementType(0);
else
return type;
}
template <typename... Values>
Instruction *ParseContext::build_dxil_call(DXIL::Op op, Type *return_type, Type *overload_type, Values&&... values)
{
auto *func = dxil_intrinsics.get(
module, op, return_type,
Vector<Type *> { Type::getInt32Ty(context), get_value_type(values)... }, overload_type, tween_id);
auto *inst = context.construct<CallInst>(
func->getFunctionType(), func,
Vector<Value *> { get_constant_uint(uint32_t(op)), values... });
return inst;
}
Instruction *ParseContext::build_dxil_call(DXIL::Op op, Type *return_type, Type *overload_type, Vector<Value *> values)
{
Vector<Type *> types;
types.reserve(values.size() + 1);
types.push_back(Type::getInt32Ty(context));
for (auto *v : values)
types.push_back(v->getType());
auto *func = dxil_intrinsics.get(module, op, return_type, types, overload_type, tween_id);
values.insert(values.begin(), get_constant_uint(uint32_t(op)));
auto *inst = context.construct<CallInst>(func->getFunctionType(), func, std::move(values));
return inst;
}
bool ParseContext::emit_constant(const ir::Op &op)
{
auto &type = op.getType();
Value *value = nullptr;
if (type.isBasicType())
{
auto *llvm_type = convert_type(type);
if (type.isScalarType())
{
if (type.getBaseType(0).isIntType())
value = ConstantInt::get(llvm_type, uint64_t(op.getOperand(0)));
else if (type.getBaseType(0).isFloatType())
value = ConstantFP::get(llvm_type, uint64_t(op.getOperand(0)));
else if (type.getBaseType(0).isBoolType())
value = ConstantInt::get(llvm_type, bool(op.getOperand(0)));
else
return false;
}
else
{
Vector<Value *> constants;
constants.reserve(op.getOperandCount());
auto *llvm_sub_type = get_scalar_type(llvm_type);
if (type.getBaseType(0).isIntType())
{
for (uint32_t i = 0; i < op.getOperandCount(); i++)
constants.push_back(ConstantInt::get(llvm_sub_type, uint64_t(op.getOperand(i))));
}
else if (type.getBaseType(0).isFloatType())
{
for (uint32_t i = 0; i < op.getOperandCount(); i++)
constants.push_back(ConstantFP::get(llvm_sub_type, uint64_t(op.getOperand(i))));
}
else
return false;
value = context.construct<ConstantDataVector>(convert_type(type), std::move(constants));
}
}
else if (type.isArrayType())
{
// This is quite flexible, but only support what we can reasonably expect to see. Extend and generalize if needed.
auto elem_type = type.getSubType(0);
if (!elem_type.isScalarType() && !elem_type.isVectorType())
return false;
uint32_t vecsize = elem_type.getBaseType(0).getVectorSize();
assert(vecsize && op.getOperandCount() % vecsize == 0);
uint32_t array_elements = op.getOperandCount() / vecsize;
Vector<Value *> constants;
Vector<Value *> values;
values.reserve(array_elements);
constants.reserve(vecsize);
auto *llvm_sub_type = convert_type(elem_type);
for (uint32_t elem = 0; elem < array_elements; elem++)
{
constants.clear();
for (uint32_t c = 0; c < vecsize; c++)
{
if (elem_type.getBaseType(0).isIntType())
{
constants.push_back(ConstantInt::get(get_scalar_type(llvm_sub_type),
uint64_t(op.getOperand(elem * vecsize + c))));
}
else if (elem_type.getBaseType(0).isFloatType())
{
constants.push_back(ConstantFP::get(get_scalar_type(llvm_sub_type),
uint64_t(op.getOperand(elem * vecsize + c))));
}
else
return false;
}
if (elem_type.isVectorType())
values.push_back(context.construct<ConstantDataVector>(convert_type(elem_type), constants));
else
values.push_back(constants[0]);
}
auto *constant_value = context.construct<ConstantDataArray>(convert_type(op.getType()), values);
auto *lut = context.construct<GlobalVariable>(
PointerType::get(convert_type(op.getType()), uint32_t(DXIL::AddressSpace::Thread)),
GlobalVariable::LinkageTypes::I
gitextract_06b8vcw_/
├── .clang-format
├── .gitattributes
├── .gitignore
├── .gitmodules
├── CMakeLists.txt
├── DESCRIPTORS.md
├── LICENSE.MIT
├── README.md
├── bc/
│ ├── CMakeLists.txt
│ ├── cast.hpp
│ ├── context.cpp
│ ├── context.hpp
│ ├── data_structures.hpp
│ ├── disassembler.cpp
│ ├── function.cpp
│ ├── function.hpp
│ ├── instruction.cpp
│ ├── instruction.hpp
│ ├── iterator.hpp
│ ├── metadata.cpp
│ ├── metadata.hpp
│ ├── module.cpp
│ ├── module.hpp
│ ├── module_dxbc_ir.cpp
│ ├── type.cpp
│ ├── type.hpp
│ ├── value.cpp
│ └── value.hpp
├── build_dxc.sh
├── cfg_structurizer.cpp
├── cfg_structurizer.hpp
├── checkout_dxc.sh
├── checkout_llvm.sh
├── copy_reference_shaders.py
├── debug/
│ ├── logging.cpp
│ └── logging.hpp
├── descriptor_qa.cpp
├── descriptor_qa.hpp
├── dxbc_spirv_sandbox.cpp
├── dxil-disasm.py
├── dxil.hpp
├── dxil_converter.cpp
├── dxil_converter.hpp
├── dxil_extract.cpp
├── dxil_parser.cpp
├── dxil_parser.hpp
├── dxil_spirv.cpp
├── dxil_spirv_c.cpp
├── dxil_spirv_c.h
├── external/
│ └── CMakeLists.txt
├── format_all.sh
├── ir.hpp
├── link.T
├── llvm_bitcode_parser.cpp
├── llvm_bitcode_parser.hpp
├── memory_stream.cpp
├── memory_stream.hpp
├── meson.build
├── misc/
│ └── structurize_test.cpp
├── node.cpp
├── node.hpp
├── node_pool.cpp
├── node_pool.hpp
├── opcodes/
│ ├── converter_impl.hpp
│ ├── dxil/
│ │ ├── dxil_ags.cpp
│ │ ├── dxil_ags.hpp
│ │ ├── dxil_arithmetic.cpp
│ │ ├── dxil_arithmetic.hpp
│ │ ├── dxil_buffer.cpp
│ │ ├── dxil_buffer.hpp
│ │ ├── dxil_common.cpp
│ │ ├── dxil_common.hpp
│ │ ├── dxil_compute.cpp
│ │ ├── dxil_compute.hpp
│ │ ├── dxil_geometry.cpp
│ │ ├── dxil_geometry.hpp
│ │ ├── dxil_mesh.cpp
│ │ ├── dxil_mesh.hpp
│ │ ├── dxil_nvapi.cpp
│ │ ├── dxil_nvapi.hpp
│ │ ├── dxil_pixel_ops.cpp
│ │ ├── dxil_pixel_ops.hpp
│ │ ├── dxil_ray_tracing.cpp
│ │ ├── dxil_ray_tracing.hpp
│ │ ├── dxil_resources.cpp
│ │ ├── dxil_resources.hpp
│ │ ├── dxil_sampling.cpp
│ │ ├── dxil_sampling.hpp
│ │ ├── dxil_tessellation.cpp
│ │ ├── dxil_tessellation.hpp
│ │ ├── dxil_waveops.cpp
│ │ ├── dxil_waveops.hpp
│ │ ├── dxil_workgraph.cpp
│ │ └── dxil_workgraph.hpp
│ ├── opcodes.hpp
│ ├── opcodes_dxil_builtins.cpp
│ ├── opcodes_dxil_builtins.hpp
│ ├── opcodes_llvm_builtins.cpp
│ └── opcodes_llvm_builtins.hpp
├── pkg-config/
│ └── dxil-spirv-c-shared.pc.in
├── reference/
│ └── shaders/
│ ├── ags/
│ │ ├── ags.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.full-wmma.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.ssbo.comp
│ │ ├── cs_wmma_alloca.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_extract_insert.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_at.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_bt.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ct.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ot.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f32.sm66.ssbo.comp
│ │ ├── cs_wmma_fp16_fp8_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp16_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp8_conversions.sm66.ssbo.nv-coopmat2.comp
│ │ ├── cs_wmma_fp8_fp32_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_lds_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_matrix_length.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.full-wmma.sm66.ssbo.comp
│ │ └── cs_wmma_store_phi.sm66.ssbo.comp
│ ├── alloca-opts/
│ │ ├── bad-stride.frag
│ │ ├── double-array-load.frag
│ │ ├── float4-array-load.bindless.frag
│ │ ├── float4-array-load.bindless.root-constants.frag
│ │ ├── float4-array-load.frag
│ │ ├── float4-array-load.root-constant.frag
│ │ ├── float4-array-load.root-descriptor.frag
│ │ ├── float4-array-load.root-descriptor.root-constants.frag
│ │ ├── load-different.frag
│ │ ├── local-root-constants.local-root-signature.rgen
│ │ ├── matrix-load.frag
│ │ ├── missing-first.frag
│ │ ├── missing-last-element.frag
│ │ ├── out-of-order-load.frag
│ │ ├── store-after-load.frag
│ │ └── uint4-array-load.frag
│ ├── asm/
│ │ ├── bfi.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps-single-alias.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps.bc.dxil
│ │ ├── constant-struct-aggregate.bc.dxil
│ │ ├── control-flow-multi-break-with-non-idom-loop-header.dxil
│ │ ├── ibfe.bc.dxil
│ │ └── ubfe.bc.dxil
│ ├── auto-barrier/
│ │ ├── complex-loop.auto-group-shared-barrier.comp
│ │ ├── inner-to-inner.auto-group-shared-barrier.comp
│ │ ├── inner-to-outer.auto-group-shared-barrier.comp
│ │ ├── outer-to-inner.auto-group-shared-barrier.comp
│ │ ├── single-block-loop.auto-group-shared-barrier.comp
│ │ └── single-block.auto-group-shared-barrier.comp
│ ├── control-flow/
│ │ ├── branch-return-2.comp
│ │ ├── branch-return.comp
│ │ ├── branch.comp
│ │ ├── conditional-break-into-if-else-if-ladder-2.comp
│ │ ├── conditional-break-into-if-else-if-ladder.comp
│ │ ├── dual-inner-loop-early-return.comp
│ │ ├── if-else-if-into-continue.comp
│ │ ├── inner-loop-early-return.comp
│ │ ├── interleaved-unrolled-loop-breaks.comp
│ │ ├── loop-break-2.comp
│ │ ├── loop-break.comp
│ │ ├── loop-continue-2.comp
│ │ ├── loop-continue-3.comp
│ │ ├── loop-continue.comp
│ │ ├── loop-inside-infinite-loop-2.frag
│ │ ├── loop-inside-infinite-loop.frag
│ │ ├── loop-return.comp
│ │ ├── loop.comp
│ │ ├── nested-loop-break-2.comp
│ │ ├── nested-loop-break.comp
│ │ ├── nested-loop.comp
│ │ ├── selection-merge-split-post-domination.frag
│ │ ├── switch-continue.frag
│ │ ├── switch-merge-into-other-merge.comp
│ │ ├── switch-shared-header-with-loop.comp
│ │ └── wave-size-dependent-loop-unroll.comp
│ ├── descriptor_qa/
│ │ ├── acceleration-structure.bindless.descriptor-qa.rgen
│ │ ├── acceleration-structure.bindless.descriptor-qa.sm66.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.descriptor-qa.rgen
│ │ ├── descriptor_qa.bindless.cbv-as-ssbo.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.sm66.comp
│ │ ├── descriptor_qa.bindless.ssbo.descriptor-qa.comp
│ │ ├── early-2.bindless.descriptor-qa.frag
│ │ ├── early-3.bindless.descriptor-qa.frag
│ │ ├── early-4.bindless.descriptor-qa.frag
│ │ ├── early-5.bindless.descriptor-qa.frag
│ │ ├── early-heap.descriptor-qa.sm66.frag
│ │ └── early.bindless.descriptor-qa.frag
│ ├── dxil-builtin/
│ │ ├── accept-hit-and-end-search-ignore-hit.rany
│ │ ├── acos.frag
│ │ ├── asin.frag
│ │ ├── atan.frag
│ │ ├── atomic-bin-op.bindless.root-constant.frag
│ │ ├── atomic-bin-op.frag
│ │ ├── atomic-bin-op.root-descriptor.comp
│ │ ├── atomic-bin-op.ssbo.frag
│ │ ├── atomic-compare-exchange.frag
│ │ ├── atomic-compare-exchange.root-descriptor.comp
│ │ ├── atomic-compare-exchange.ssbo.frag
│ │ ├── attributes.denorm-ftz.comp
│ │ ├── attributes.denorm-preserve.comp
│ │ ├── barrier.comp
│ │ ├── barycentrics-2.frag
│ │ ├── barycentrics.frag
│ │ ├── bfrev.frag
│ │ ├── bitcount-bitrev-sizes.ssbo.comp
│ │ ├── buffer-load-feedback.frag
│ │ ├── buffer-load-signed-feedback.frag
│ │ ├── buffer-load-signed.frag
│ │ ├── buffer-load.frag
│ │ ├── buffer-load.ssbo.frag
│ │ ├── buffer-store-signed.frag
│ │ ├── buffer-store.frag
│ │ ├── buffer-store.ssbo.frag
│ │ ├── buffer-update-counter.frag
│ │ ├── calculate-lod.frag
│ │ ├── call-shader.rgen
│ │ ├── clip.demote-to-helper.frag
│ │ ├── clip.frag
│ │ ├── compute-shader-derivatives-cube-array.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-cube.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-single-thread.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives.noderivs.sm66.ssbo.comp
│ │ ├── cos.frag
│ │ ├── countbits.frag
│ │ ├── coverage.frag
│ │ ├── derivative.frag
│ │ ├── derivative.sm60.frag
│ │ ├── derivative.sm60.native-fp16.frag
│ │ ├── derivatives.sm66.comp
│ │ ├── discard.demote-to-helper.frag
│ │ ├── discard.frag
│ │ ├── dispatch-rays-dimensions.rgen
│ │ ├── dispatch-rays-index.rgen
│ │ ├── dot2.frag
│ │ ├── dot3.frag
│ │ ├── dot4.frag
│ │ ├── eval-centroid.frag
│ │ ├── eval-sample-index.frag
│ │ ├── eval-snapped.frag
│ │ ├── exp.frag
│ │ ├── f16-to-f32.frag
│ │ ├── f32-to-f16.frag
│ │ ├── fabs.frag
│ │ ├── firstbithi-16.sm62.frag
│ │ ├── firstbithi-64.frag
│ │ ├── firstbithi.frag
│ │ ├── firstbitlo-16.sm62.frag
│ │ ├── firstbitlo-64.frag
│ │ ├── firstbitlo.frag
│ │ ├── firstbitshi-16.sm62.frag
│ │ ├── firstbitshi-64.frag
│ │ ├── firstbitshi.frag
│ │ ├── flattened_thread_id_in_group.comp
│ │ ├── fma.frag
│ │ ├── fmad-precise.frag
│ │ ├── fmad.frag
│ │ ├── fmax.frag
│ │ ├── fmin.frag
│ │ ├── frc.frag
│ │ ├── get-dimensions-w-only.frag
│ │ ├── get-dimensions-xyz-only.frag
│ │ ├── get-dimensions.bindless.root-constant.frag
│ │ ├── get-dimensions.bindless.root-constant.ssbo.frag
│ │ ├── get-dimensions.frag
│ │ ├── get-dimensions.ssbo.frag
│ │ ├── group_id.comp
│ │ ├── hcos.frag
│ │ ├── hsin.frag
│ │ ├── htan.frag
│ │ ├── imad.frag
│ │ ├── imax.frag
│ │ ├── imin.frag
│ │ ├── instance-id.vert
│ │ ├── is-helper-lane-2.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane-2.sm66.frag
│ │ ├── is-helper-lane.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane.sm66.frag
│ │ ├── isfinite.frag
│ │ ├── isinf.frag
│ │ ├── isnan.frag
│ │ ├── log.frag
│ │ ├── make-double.frag
│ │ ├── msaa-uav.sm67.comp
│ │ ├── msad.comp
│ │ ├── object-ray-direction.rany
│ │ ├── object-ray-origin.rany
│ │ ├── object-to-world-3x4.rany
│ │ ├── object-to-world-4x3.rany
│ │ ├── pack-unpack.ssbo.sm66.comp
│ │ ├── quad-all-any.sm67.comp
│ │ ├── quad-all-any.sm67.quad-maximal-reconvergence.noglsl.comp
│ │ ├── quad-read-at-2d.comp
│ │ ├── quad-read-at-2d.sm66.comp
│ │ ├── quad-read-at.comp
│ │ ├── quad-read-at.frag
│ │ ├── quad-swap.comp
│ │ ├── quad-swap.frag
│ │ ├── raw-gather-offset-sparse.sm67.ssbo.comp
│ │ ├── raw-gather-offset.sm67.ssbo.comp
│ │ ├── raw-gather-sparse.sm67.ssbo.comp
│ │ ├── raw-gather.sm67.ssbo.comp
│ │ ├── ray-query-phi-multi.invalid.sm66.comp
│ │ ├── ray-query-phi-simple.sm66.comp
│ │ ├── ray-query-select-multi.invalid.sm66.comp
│ │ ├── ray-query-select-simple.sm66.comp
│ │ ├── ray-query-store-multi.invalid.sm66.comp
│ │ ├── ray-query-store-simple.sm66.comp
│ │ ├── ray-query.comp
│ │ ├── ray-t-current.rany
│ │ ├── ray-t-min.rany
│ │ ├── render-target-sample-count.frag
│ │ ├── render-target-sample-position.frag
│ │ ├── report-hit.rint
│ │ ├── round-ne.frag
│ │ ├── round-ni.frag
│ │ ├── round-pi.frag
│ │ ├── round-z.frag
│ │ ├── rsqrt.frag
│ │ ├── rt-geometry-index.rany
│ │ ├── rt-hit-kind.rany
│ │ ├── rt-instance-id.rany
│ │ ├── rt-instance-index.rany
│ │ ├── rt-primitive-index.rany
│ │ ├── rt-ray-flags.rany
│ │ ├── sample-bias-feedback.frag
│ │ ├── sample-bias-offset.frag
│ │ ├── sample-bias.frag
│ │ ├── sample-cmp-bias-feedback.frag
│ │ ├── sample-cmp-bias-offset.frag
│ │ ├── sample-cmp-bias.frag
│ │ ├── sample-cmp-feedback.frag
│ │ ├── sample-cmp-grad-offset-feedback.frag
│ │ ├── sample-cmp-grad-offset.frag
│ │ ├── sample-cmp-grad.frag
│ │ ├── sample-cmp-level.sm67.noglsl.frag
│ │ ├── sample-cmp-levelzero.frag
│ │ ├── sample-cmp-offset-levelzero-feedback.frag
│ │ ├── sample-cmp-offset-levelzero.frag
│ │ ├── sample-cmp-offset.frag
│ │ ├── sample-cmp.frag
│ │ ├── sample-grad-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-grad-offset-feedback.frag
│ │ ├── sample-grad-offset.frag
│ │ ├── sample-grad.frag
│ │ ├── sample-id.frag
│ │ ├── sample-level-offset-feedback.frag
│ │ ├── sample-level-offset.frag
│ │ ├── sample-level.frag
│ │ ├── sample-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-offset.frag
│ │ ├── sample.frag
│ │ ├── saturate.frag
│ │ ├── sin.frag
│ │ ├── sm64-packed-arithmetic.ssbo.comp
│ │ ├── sm64-packed-arithmetic.ssbo.i8dot.noglsl.comp
│ │ ├── sm64-packed-arithmetic.ssbo.mixed-float-dot-product.noglsl.comp
│ │ ├── split-double.frag
│ │ ├── sqrt.frag
│ │ ├── tan.frag
│ │ ├── texture-gather-4offset.frag
│ │ ├── texture-gather-cmp-offset-feedback.frag
│ │ ├── texture-gather-cmp-offset.frag
│ │ ├── texture-gather-cmp.frag
│ │ ├── texture-gather-offset.frag
│ │ ├── texture-gather-signed-feedback.frag
│ │ ├── texture-gather-signed.frag
│ │ ├── texture-gather.frag
│ │ ├── texture-load-feedback.frag
│ │ ├── texture-load-offset-dynamic.sm67.frag
│ │ ├── texture-load-offset.frag
│ │ ├── texture-load-signed.frag
│ │ ├── texture-load.frag
│ │ ├── texture-store-signed.frag
│ │ ├── texture-store.frag
│ │ ├── texture2dms-sample-position.frag
│ │ ├── thread_id.comp
│ │ ├── thread_id_in_group.comp
│ │ ├── trace-ray-flags-2.rgen
│ │ ├── trace-ray-flags.rgen
│ │ ├── trace-ray.rgen
│ │ ├── umad.frag
│ │ ├── umax.frag
│ │ ├── umin.frag
│ │ ├── vertex-id.vert
│ │ ├── wave-active-all-true.comp
│ │ ├── wave-active-all-true.frag
│ │ ├── wave-active-any-true.comp
│ │ ├── wave-active-any-true.frag
│ │ ├── wave-active-ballot-discard.demote-to-helper.frag
│ │ ├── wave-active-ballot-discard.frag
│ │ ├── wave-active-ballot.comp
│ │ ├── wave-active-ballot.demote-to-helper.frag
│ │ ├── wave-active-ballot.frag
│ │ ├── wave-active-count-bits.comp
│ │ ├── wave-active-count-bits.frag
│ │ ├── wave-all-equal.comp
│ │ ├── wave-all-equal.frag
│ │ ├── wave-get-lane-count.comp
│ │ ├── wave-get-lane-index.comp
│ │ ├── wave-is-first-lane.comp
│ │ ├── wave-is-first-lane.frag
│ │ ├── wave-match.comp
│ │ ├── wave-match.frag
│ │ ├── wave-match.partitioned.noglsl.comp
│ │ ├── wave-match.partitioned.noglsl.frag
│ │ ├── wave-multi-prefix-count-bits.comp
│ │ ├── wave-multi-prefix-count-bits.frag
│ │ ├── wave-multi-prefix-op.comp
│ │ ├── wave-multi-prefix-op.frag
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.comp
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.frag
│ │ ├── wave-prefix.comp
│ │ ├── wave-prefix.frag
│ │ ├── wave-read-lane-at-optimizations.comp
│ │ ├── wave-read-lane-at.comp
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.frag
│ │ ├── wave-reduce-helpers.sm67.frag
│ │ ├── wave-reduce-helpers.sm67.quad-maximal-reconvergence.frag
│ │ ├── wave-reduce.comp
│ │ ├── wave-reduce.frag
│ │ ├── wave-size.sm66.comp
│ │ ├── world-ray-direction.rany
│ │ ├── world-ray-origin.rany
│ │ ├── world-to-object-3x4.rany
│ │ └── world-to-object-4x3.rany
│ ├── fp16/
│ │ ├── saturate.frag
│ │ ├── saturate.sm60.frag
│ │ └── saturate.sm60.native-fp16.frag
│ ├── heap-robustness/
│ │ ├── misc.bindless.heap-raw-va-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.heap-robustness-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.sm66.ssbo.comp
│ │ ├── misc.bindless.sm66.ssbo.comp
│ │ └── misc.heap-robustness.bindless.heap-robustness-cbv.heap-raw-va-cbv.sm66.ssbo.comp
│ ├── instrumentation/
│ │ ├── atomics-raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured-counter.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-typed.bindless.bda-instrumentation.ssbo.comp
│ │ ├── cbv.bindless.bda-instrumentation.comp
│ │ ├── cbv.root-descriptor.bda-instrumentation.comp
│ │ ├── raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── structured.bindless.bda-instrumentation.comp
│ │ ├── structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ └── typed.bindless.bda-instrumentation.comp
│ ├── llvm-builtin/
│ │ ├── alloca-robustness-cases.extended-robustness.vert
│ │ ├── alloca.frag
│ │ ├── atomic-bin-op.comp
│ │ ├── atomic-compare-exchange.comp
│ │ ├── atomic-compare-exchange.sm66.ssbo.comp
│ │ ├── bool-to-fp.frag
│ │ ├── constant-expression-cast.comp
│ │ ├── constant-expression-gep.comp
│ │ ├── fadd.frag
│ │ ├── fast-mul-div-pair.comp
│ │ ├── fcmp_eq.frag
│ │ ├── fcmp_ge.frag
│ │ ├── fcmp_gt.frag
│ │ ├── fcmp_le.frag
│ │ ├── fcmp_lt.frag
│ │ ├── fcmp_ne.frag
│ │ ├── fdiv.frag
│ │ ├── fmul.frag
│ │ ├── frem.frag
│ │ ├── fsub.frag
│ │ ├── glitched-integer-width.comp
│ │ ├── groupshared.comp
│ │ ├── icmp_eq.frag
│ │ ├── icmp_ne.frag
│ │ ├── icmp_sge.frag
│ │ ├── icmp_sgt.frag
│ │ ├── icmp_sle.frag
│ │ ├── icmp_slt.frag
│ │ ├── icmp_uge.frag
│ │ ├── icmp_ugt.frag
│ │ ├── icmp_ule.frag
│ │ ├── icmp_ult.frag
│ │ ├── logical-and.frag
│ │ ├── logical-equal.frag
│ │ ├── logical-not-equal.frag
│ │ ├── logical-or.frag
│ │ ├── lut.frag
│ │ ├── min16-phi.sm60.comp
│ │ ├── precise_math.frag
│ │ └── zext-bool.frag
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.comp
│ │ ├── uav-coherent-promotion.ssbo.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.comp
│ │ ├── uav-coherent.sm66.ssbo.comp
│ │ └── uav-coherent.ssbo.comp
│ ├── nvapi/
│ │ ├── bringup.nvapi.ssbo.rgen
│ │ ├── get-special-global-timer.nvapi.ssbo.rgen
│ │ ├── hit-object.local-root-signature.noglsl.nvapi.ssbo.rgen
│ │ ├── ray-query-cluster-id.nvapi.comp
│ │ ├── rt-cluster-id.nvapi.rany
│ │ └── shuffle.nvapi.ssbo.comp
│ ├── opts/
│ │ ├── fp16-fp32-fp16-1.ssbo.comp
│ │ ├── sabs.frag
│ │ ├── sneg.frag
│ │ ├── wave-read-lane-first-heap.sm66.comp
│ │ ├── wave-read-lane-first.bindless.local-root-signature.rmiss
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.sm60.comp
│ │ ├── wave-read-lane-first.sm60.comp
│ │ ├── wave-read-lane-first.sm66.comp
│ │ ├── wave-read-lane-first.ssbo.comp
│ │ ├── wave-read-lane-first.ssbo.rgen
│ │ ├── wave-read-lane-first.ssbo.sm60.comp
│ │ ├── wave-read-lane-first.ssbo.sm66.comp
│ │ └── wave-read-lane-first.ssbo.sm66.rgen
│ ├── raw-access/
│ │ ├── bab-double1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-half1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-uint1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint3.raw-access-chains.noglsl.ssbo.comp
│ │ └── structured-uint4.raw-access-chains.noglsl.ssbo.comp
│ ├── resources/
│ │ ├── acceleration-structure.bindless.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.raw-va-stride-offset.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.rgen
│ │ ├── acceleration-structure.local-root-signature.root-descriptor.rgen
│ │ ├── basic.input-attachment.frag
│ │ ├── buffer-16bit.ssbo.bindless.comp
│ │ ├── buffer-16bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-16bit.ssbo.comp
│ │ ├── buffer-64bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-64bit.ssbo.comp
│ │ ├── buffer-alignment-fixup.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── cbuf.root-constant.min16float.sm60.frag
│ │ ├── cbuf.root-constant.min16float.sm60.native-fp16.frag
│ │ ├── cbuf.root-constant.min16int.sm60.frag
│ │ ├── cbuf.root-constant.min16int.sm60.native-fp16.frag
│ │ ├── cbv-array-nonuniform.frag
│ │ ├── cbv-array.frag
│ │ ├── cbv-dynamic.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv-indexing.frag
│ │ ├── cbv-indexing.sm66.frag
│ │ ├── cbv-legacy-fp16-fp64.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.native-fp16.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.native-fp16.frag
│ │ ├── cbv.bindless.root-constant.cbv-as-ssbo.frag
│ │ ├── cbv.bindless.root-constant.frag
│ │ ├── cbv.frag
│ │ ├── cbv.no-legacy-cbuf-layout.bindless.frag
│ │ ├── cbv.no-legacy-cbuf-layout.index-divider.frag
│ │ ├── cbv.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv.no-legacy-cbuf-layout.native-fp16.sm60.frag
│ │ ├── cbv.no-legacy-cbuf-layout.root-constant.frag
│ │ ├── cbv.root-constant.frag
│ │ ├── cbv.root-descriptor.no-legacy-cbuf-layout.frag
│ │ ├── combined-image-sampler-reuse.frag
│ │ ├── dynamic-root-constant.root-constant.bindless.root-descriptor.comp
│ │ ├── min16-alloca-groupshared.sm60.comp
│ │ ├── min16float-ssbo-dxr.ssbo.rgen
│ │ ├── raw-buffer-addressing.comp
│ │ ├── raw-buffer-addressing.ssbo.comp
│ │ ├── root-bda.root-descriptor.comp
│ │ ├── root-bda.root-descriptor.sm60.comp
│ │ ├── root-constant-with-bda.root-descriptor.root-constant.comp
│ │ ├── rt-resources.bindless.local-root-signature.rmiss
│ │ ├── rt-resources.bindless.rmiss
│ │ ├── rt-resources.rmiss
│ │ ├── sampler-array.frag
│ │ ├── sampler-indexing.frag
│ │ ├── sampler-indexing.sm66.frag
│ │ ├── sampler.bindless.root-constant.frag
│ │ ├── sm66/
│ │ │ ├── atomics-64bit-groupshared.ssbo.sm66.comp
│ │ │ ├── atomics-64bit.root-descriptor.sm66.comp
│ │ │ ├── atomics-64bit.ssbo.sm66.comp
│ │ │ ├── atomics-component-alias.sm66.comp
│ │ │ ├── atomics-typed-64bit-heap.sm66.comp
│ │ │ ├── atomics-typed-64bit.bindless.sm66.comp
│ │ │ ├── atomics-typed-64bit.sm66.comp
│ │ │ ├── binding-range-selection.bindless.sm66.comp
│ │ │ ├── binding-range-selection.sm66.comp
│ │ │ ├── buffer-64bit-double.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.ssbo-align.sm66.comp
│ │ │ ├── cbuffer-heap.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.bindless.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.sm66.frag
│ │ │ ├── raw-buffer-heap.sm66.frag
│ │ │ ├── raw-buffer-heap.ssbo.sm66.frag
│ │ │ ├── raw-buffer-heap.typed-buffer-offset.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.ssbo-align.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.sm66.frag
│ │ │ ├── raygen-heap.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.sm66.rgen
│ │ │ ├── raygen.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.sm66.rgen
│ │ │ ├── rw-typed-binding.sm66.frag
│ │ │ ├── rw-typed-heap.sm66.frag
│ │ │ ├── sampled-types-binding.sm66.frag
│ │ │ ├── sampled-types.sm66.frag
│ │ │ ├── sampler-binding.sm66.frag
│ │ │ ├── sampler-heap.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.ssbo-align.sm66.frag
│ │ │ ├── structured-buffer-heap.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.ssbo-align.sm66.frag
│ │ │ └── structured-buffer-heap.typed-buffer-offset.sm66.frag
│ │ ├── srv-array-raw-buffer-nonuniform.frag
│ │ ├── srv-array-raw-buffer.frag
│ │ ├── srv-array-structured-buffer-nonuniform.frag
│ │ ├── srv-array-structured-buffer.frag
│ │ ├── srv-array-texture-nonuniform.frag
│ │ ├── srv-array-texture.frag
│ │ ├── srv-array-typed-buffer-nonuniform.frag
│ │ ├── srv-array-typed-buffer.frag
│ │ ├── srv-indexing.frag
│ │ ├── srv-indexing.sm66.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-raw-buffer.ssbo.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-structured-buffer.ssbo.frag
│ │ ├── srv-texture.bindless.root-constant.frag
│ │ ├── srv-texture.bindless.root-constant.inline-ubo.frag
│ │ ├── srv-typed-buffer.bindless.root-constant.frag
│ │ ├── srv-uav-raw.typed-buffer-offset.comp
│ │ ├── srv-uav.typed-buffer-offset.comp
│ │ ├── ssbo-minprecision.sm60.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.root-descriptor.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.root-descriptor.frag
│ │ ├── subobject-parsing.rgen
│ │ ├── typed-resources-16bit-sparse.frag
│ │ ├── typed-resources-16bit.bindless.frag
│ │ ├── typed-resources-16bit.frag
│ │ ├── typed-resources-16bit.sm60.bindless.frag
│ │ ├── typed-resources-16bit.sm60.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.bindless.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.frag
│ │ ├── uav-array-raw-buffer-nonuniform.frag
│ │ ├── uav-array-raw-buffer.frag
│ │ ├── uav-array-structured-buffer-nonuniform.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.bindless.root-constant.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.frag
│ │ ├── uav-array-structured-buffer.frag
│ │ ├── uav-array-texture-nonuniform.frag
│ │ ├── uav-array-texture.frag
│ │ ├── uav-array-typed-buffer-nonuniform.frag
│ │ ├── uav-array-typed-buffer.frag
│ │ ├── uav-counter-array.ssbo.frag
│ │ ├── uav-counter-array.ssbo.sm66.frag
│ │ ├── uav-counter-array.ssbo.sm66.uav-counter-ssbo.frag
│ │ ├── uav-counter-array.ssbo.uav-counter-ssbo.frag
│ │ ├── uav-counter-heap.sm66.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-ssbo.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-texel-buffer.bindless.ssbo.frag
│ │ ├── uav-counter.bindless.nobda.root-constant.comp
│ │ ├── uav-counter.bindless.nobda.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.heap-raw-va-cbv.comp
│ │ ├── uav-counter.bindless.root-constant.uav-counter-ssbo.comp
│ │ ├── uav-counter.ssbo.comp
│ │ ├── uav-counter.ssbo.raw-va-stride-offset.comp
│ │ ├── uav-counter.ssbo.uav-counter-ssbo.comp
│ │ ├── uav-indexing.frag
│ │ ├── uav-indexing.sm66.frag
│ │ ├── uav-raw-buffer.bindless.root-constant.frag
│ │ ├── uav-raw-buffer.ssbo.frag
│ │ ├── uav-structured-buffer.bindless.root-constant.frag
│ │ ├── uav-typed-buffer.bindless.root-constant.frag
│ │ └── uav-typed.typed-uav-without-format.comp
│ ├── rov/
│ │ ├── rov-bab.bindless.frag
│ │ ├── rov-bab.frag
│ │ ├── rov-bab.ssbo.bindless.frag
│ │ ├── rov-bab.ssbo.frag
│ │ ├── rov-bab.ssbo.root-descriptor.frag
│ │ ├── rov-branch-early-return.frag
│ │ ├── rov-branch.frag
│ │ ├── rov-buffer.frag
│ │ ├── rov-inloop-2.frag
│ │ ├── rov-inloop.frag
│ │ ├── rov-per-sample.sm66.frag
│ │ ├── rov-postloop.frag
│ │ ├── rov-structured.bindless.frag
│ │ ├── rov-structured.frag
│ │ ├── rov-structured.ssbo.bindless.frag
│ │ ├── rov-structured.ssbo.frag
│ │ ├── rov-structured.ssbo.root-descriptor.frag
│ │ ├── rov-tex1d.bindless.frag
│ │ ├── rov-tex1d.frag
│ │ ├── rov-tex1darray.bindless.frag
│ │ ├── rov-tex1darray.frag
│ │ ├── rov-tex2d.bindless.frag
│ │ ├── rov-tex2d.frag
│ │ ├── rov-tex2darray.bindless.frag
│ │ ├── rov-tex2darray.frag
│ │ ├── rov-tex3d.bindless.frag
│ │ ├── rov-tex3d.frag
│ │ ├── rov-undef.frag
│ │ └── rov.sm66.frag
│ ├── sampler-feedback/
│ │ ├── sampler-feedback.frag
│ │ └── sampler-feedback.sm66.frag
│ ├── semantics/
│ │ ├── clip-cull-distance.vert
│ │ ├── clip-cull.frag
│ │ ├── clip-distance-cols.frag
│ │ ├── clip-distance-cols.vert
│ │ ├── clip-distance-flatten.frag
│ │ ├── clip-distance-flatten.vert
│ │ ├── clip-distance-rows.frag
│ │ ├── clip-distance-rows.vert
│ │ ├── clip-distance-single.vert
│ │ ├── coverage.frag
│ │ ├── depth-greater-equal.frag
│ │ ├── depth-less-equal.frag
│ │ ├── depth.frag
│ │ ├── early-depth-stencil.frag
│ │ ├── inner-coverage.noglsl.frag
│ │ ├── is-front-face.frag
│ │ ├── position-short.frag
│ │ ├── position-short.vert
│ │ ├── position.frag
│ │ ├── primitive-id.frag
│ │ ├── primitive-id.geom
│ │ ├── render-target-array-index.frag
│ │ ├── render-target-array-index.geom
│ │ ├── sample-rate-pos.frag
│ │ ├── stencil-ref.frag
│ │ ├── sv-shading-rate.noglsl.frag
│ │ ├── sv-shading-rate.noglsl.vert
│ │ ├── view-id.frag
│ │ ├── view-id.vert
│ │ ├── viewport-array-index.frag
│ │ └── viewport-array-index.geom
│ ├── stages/
│ │ ├── boolean-io.vert
│ │ ├── callable-chain.rcall
│ │ ├── callable.rcall
│ │ ├── closesthit.rclosest
│ │ ├── domain-clip-cull.tese
│ │ ├── domain-patch-input-integer-io.tese
│ │ ├── domain.tese
│ │ ├── extra_output.dual-source-blending.frag
│ │ ├── extra_output_reordered.dual-source-blending.frag
│ │ ├── geometry-clip-cull.geom
│ │ ├── geometry-input-line.geom
│ │ ├── geometry-input-lineadj.geom
│ │ ├── geometry-input-point.geom
│ │ ├── geometry-input-triangle.geom
│ │ ├── geometry-input-triangleadj.geom
│ │ ├── geometry-instancing.geom
│ │ ├── geometry-output-line.geom
│ │ ├── geometry-output-point.geom
│ │ ├── geometry-streams.geom
│ │ ├── hull-arrays.tesc
│ │ ├── hull-clip-cull.tesc
│ │ ├── hull-patch-output-integer-io.tesc
│ │ ├── hull-single-cp.tesc
│ │ ├── hull.tesc
│ │ ├── mesh-basic-line.mesh
│ │ ├── mesh-basic.mesh
│ │ ├── mesh-clip-cull.mesh
│ │ ├── raygen-complex-storage-class.rgen
│ │ ├── raygen-skip-inactive-resources.rgen
│ │ ├── raygen.rgen
│ │ ├── raymiss-chain.rmiss
│ │ ├── raymiss.rmiss
│ │ ├── simple.dual-source-blending.frag
│ │ ├── simple.invariant.vert
│ │ ├── stage-input-output.16bit-io.frag
│ │ ├── stage-input-output.frag
│ │ ├── stream-out.stream-out.vert
│ │ ├── swizzle.rt-swizzle.frag
│ │ ├── task-basic.task
│ │ ├── vertex-array-input.vert
│ │ ├── vertex-array-output.vert
│ │ └── vertex-input-remapping.vert
│ ├── vectorization/
│ │ ├── copy-byte-address.ssbo.comp
│ │ ├── copy-composite-2.ssbo.comp
│ │ ├── copy-composite.ssbo.comp
│ │ ├── copy-composite.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double2.ssbo.comp
│ │ ├── copy-double2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double3.ssbo.comp
│ │ ├── copy-double3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double4.ssbo.comp
│ │ ├── copy-float2.ssbo.comp
│ │ ├── copy-float2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float2x2.ssbo.comp
│ │ ├── copy-float3.ssbo.comp
│ │ ├── copy-float3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float4x4.ssbo.comp
│ │ ├── copy-half2.ssbo.comp
│ │ ├── copy-half2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half3.ssbo.comp
│ │ ├── copy-half3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half4.ssbo.comp
│ │ └── copy-half4.ssbo.ssbo-align.bindless.comp
│ ├── view-instancing/
│ │ ├── geom/
│ │ │ ├── basic.view-instancing.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.view-instancing-viewport-offset.last-pre-raster.geom
│ │ │ └── basic.view-instancing.view-instancing-viewport-offset.last-pre-raster.geom
│ │ ├── mesh/
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ ├── basic-few-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-many-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ └── basic.view-instancing.mesh
│ │ ├── tesc/
│ │ │ ├── basic.view-instancing.tesc
│ │ │ └── basic.view-instancing.view-instancing-multiview.tesc
│ │ ├── tese/
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.view-instancing-viewport-offset.last-pre-raster.tese
│ │ │ └── domain.view-instancing.view-instancing-viewport-offset.tese
│ │ └── vert/
│ │ ├── basic.view-instancing.export-layer-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer-viewport.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-layer.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-viewport.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.last-pre-raster.vert
│ │ ├── basic.view-instancing.vert
│ │ ├── basic.view-instancing.view-instance-mask.last-pre-raster.vert
│ │ ├── basic.view-instancing.view-instance-mask.vert
│ │ ├── basic.view-instancing.view-instancing-multiview.vert
│ │ └── basic.view-instancing.view-instancing-viewport-offset.vert
│ └── vkmm/
│ ├── coopmat.sm66.ssbo.vkmm.comp
│ ├── cross_group_sharing.vkmm.node.inline-ubo.comp
│ ├── descriptor_qa.bindless.descriptor-qa.vkmm.comp
│ ├── groupshared.vkmm.comp
│ ├── hull.vkmm.tesc
│ ├── image-load-store.vkmm.comp
│ ├── image-load-store.vkmm.sm66.comp
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.ssbo.vkmm.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent.sm66.ssbo.vkmm.comp
│ │ └── uav-coherent.ssbo.vkmm.comp
│ ├── report-hit.vkmm.rint
│ ├── rov-structured.vkmm.frag
│ └── rov-tex2d.vkmm.frag
├── reference-dxbc/
│ ├── test_arithmetic_bool.asm
│ ├── test_arithmetic_bool.glsl
│ ├── test_arithmetic_fp16_compare.asm
│ ├── test_arithmetic_fp16_compare.glsl
│ ├── test_arithmetic_fp16_packing.asm
│ ├── test_arithmetic_fp16_packing.glsl
│ ├── test_arithmetic_fp16_packing_legacy.asm
│ ├── test_arithmetic_fp16_packing_legacy.glsl
│ ├── test_arithmetic_fp16_scalar.asm
│ ├── test_arithmetic_fp16_scalar.glsl
│ ├── test_arithmetic_fp16_vector.asm
│ ├── test_arithmetic_fp16_vector.glsl
│ ├── test_arithmetic_fp32.asm
│ ├── test_arithmetic_fp32.glsl
│ ├── test_arithmetic_fp32_compare.asm
│ ├── test_arithmetic_fp32_compare.glsl
│ ├── test_arithmetic_fp32_precise.asm
│ ├── test_arithmetic_fp32_precise.glsl
│ ├── test_arithmetic_fp32_special.asm
│ ├── test_arithmetic_fp32_special.glsl
│ ├── test_arithmetic_fp64.asm
│ ├── test_arithmetic_fp64.glsl
│ ├── test_arithmetic_fp64_compare.asm
│ ├── test_arithmetic_fp64_compare.glsl
│ ├── test_arithmetic_fp64_packing.asm
│ ├── test_arithmetic_fp64_packing.glsl
│ ├── test_arithmetic_int_extended.asm
│ ├── test_arithmetic_int_extended.glsl
│ ├── test_arithmetic_sint16_compare.asm
│ ├── test_arithmetic_sint16_compare.glsl
│ ├── test_arithmetic_sint16_scalar.asm
│ ├── test_arithmetic_sint16_scalar.glsl
│ ├── test_arithmetic_sint16_vector.asm
│ ├── test_arithmetic_sint16_vector.glsl
│ ├── test_arithmetic_sint32.asm
│ ├── test_arithmetic_sint32.glsl
│ ├── test_arithmetic_sint32_compare.asm
│ ├── test_arithmetic_sint32_compare.glsl
│ ├── test_arithmetic_uint16_compare.asm
│ ├── test_arithmetic_uint16_compare.glsl
│ ├── test_arithmetic_uint16_scalar.asm
│ ├── test_arithmetic_uint16_scalar.glsl
│ ├── test_arithmetic_uint16_vector.asm
│ ├── test_arithmetic_uint16_vector.glsl
│ ├── test_arithmetic_uint32.asm
│ ├── test_arithmetic_uint32.glsl
│ ├── test_arithmetic_uint32_compare.asm
│ ├── test_arithmetic_uint32_compare.glsl
│ ├── test_cfg_if.asm
│ ├── test_cfg_if.glsl
│ ├── test_cfg_if_else.asm
│ ├── test_cfg_if_else.glsl
│ ├── test_cfg_loop_infinite.asm
│ ├── test_cfg_loop_infinite.glsl
│ ├── test_cfg_loop_once.asm
│ ├── test_cfg_loop_once.glsl
│ ├── test_cfg_switch_complex.asm
│ ├── test_cfg_switch_complex.glsl
│ ├── test_cfg_switch_simple.asm
│ ├── test_cfg_switch_simple.glsl
│ ├── test_convert_f_to_f.asm
│ ├── test_convert_f_to_f.glsl
│ ├── test_convert_f_to_i.asm
│ ├── test_convert_f_to_i.glsl
│ ├── test_convert_i_to_f.asm
│ ├── test_convert_i_to_f.glsl
│ ├── test_convert_i_to_i.asm
│ ├── test_convert_i_to_i.glsl
│ ├── test_io_cs_builtins.asm
│ ├── test_io_cs_builtins.glsl
│ ├── test_io_ds_isoline.asm
│ ├── test_io_ds_isoline.glsl
│ ├── test_io_ds_quad.asm
│ ├── test_io_ds_quad.glsl
│ ├── test_io_ds_triangle.asm
│ ├── test_io_ds_triangle.glsl
│ ├── test_io_gs_basic_line.asm
│ ├── test_io_gs_basic_line.glsl
│ ├── test_io_gs_basic_line_adj.asm
│ ├── test_io_gs_basic_line_adj.glsl
│ ├── test_io_gs_basic_point.asm
│ ├── test_io_gs_basic_point.glsl
│ ├── test_io_gs_basic_triangle.asm
│ ├── test_io_gs_basic_triangle.glsl
│ ├── test_io_gs_basic_triangle_adj.asm
│ ├── test_io_gs_basic_triangle_adj.glsl
│ ├── test_io_gs_instanced.asm
│ ├── test_io_gs_instanced.glsl
│ ├── test_io_gs_multi_stream_xfb_raster_0.asm
│ ├── test_io_gs_multi_stream_xfb_raster_0.glsl
│ ├── test_io_gs_multi_stream_xfb_raster_1.asm
│ ├── test_io_gs_multi_stream_xfb_raster_1.glsl
│ ├── test_io_gs_xfb.asm
│ ├── test_io_gs_xfb.glsl
│ ├── test_io_hs_line.asm
│ ├── test_io_hs_line.glsl
│ ├── test_io_hs_point.asm
│ ├── test_io_hs_point.glsl
│ ├── test_io_hs_triangle_ccw.asm
│ ├── test_io_hs_triangle_ccw.glsl
│ ├── test_io_hs_triangle_cw.asm
│ ├── test_io_hs_triangle_cw.glsl
│ ├── test_io_ps_builtins.asm
│ ├── test_io_ps_builtins.glsl
│ ├── test_io_ps_export_depth.asm
│ ├── test_io_ps_export_depth.glsl
│ ├── test_io_ps_export_depth_greater.asm
│ ├── test_io_ps_export_depth_greater.glsl
│ ├── test_io_ps_export_depth_less.asm
│ ├── test_io_ps_export_depth_less.glsl
│ ├── test_io_ps_export_stencil.asm
│ ├── test_io_ps_export_stencil.glsl
│ ├── test_io_ps_fully_covered.asm
│ ├── test_io_ps_fully_covered.glsl
│ ├── test_io_ps_interpolate_centroid.asm
│ ├── test_io_ps_interpolate_centroid.glsl
│ ├── test_io_ps_interpolate_offset.asm
│ ├── test_io_ps_interpolate_offset.glsl
│ ├── test_io_ps_interpolate_sample.asm
│ ├── test_io_ps_interpolate_sample.glsl
│ ├── test_io_vs.asm
│ ├── test_io_vs.glsl
│ ├── test_io_vs_clip_cull_dist.asm
│ ├── test_io_vs_clip_cull_dist.glsl
│ ├── test_io_vs_clip_dist.asm
│ ├── test_io_vs_clip_dist.glsl
│ ├── test_io_vs_cull_dist.asm
│ ├── test_io_vs_cull_dist.glsl
│ ├── test_io_vs_instance_id.asm
│ ├── test_io_vs_instance_id.glsl
│ ├── test_io_vs_layer.asm
│ ├── test_io_vs_layer.glsl
│ ├── test_io_vs_vertex_id.asm
│ ├── test_io_vs_vertex_id.glsl
│ ├── test_io_vs_viewport.asm
│ ├── test_io_vs_viewport.glsl
│ ├── test_misc_constant_load.asm
│ ├── test_misc_constant_load.glsl
│ ├── test_misc_function.asm
│ ├── test_misc_function.glsl
│ ├── test_misc_function_with_args.asm
│ ├── test_misc_function_with_args.glsl
│ ├── test_misc_function_with_return.asm
│ ├── test_misc_function_with_return.glsl
│ ├── test_misc_function_with_undef.asm
│ ├── test_misc_function_with_undef.glsl
│ ├── test_misc_lds.asm
│ ├── test_misc_lds.glsl
│ ├── test_misc_lds_atomic.asm
│ ├── test_misc_lds_atomic.glsl
│ ├── test_misc_ps_demote.asm
│ ├── test_misc_ps_demote.glsl
│ ├── test_misc_ps_early_z.asm
│ ├── test_misc_ps_early_z.glsl
│ ├── test_misc_scratch.asm
│ ├── test_misc_scratch.glsl
│ ├── test_resource_rov.asm
│ ├── test_resource_rov.glsl
│ ├── test_resource_srv_buffer_load_sparse_feedback.asm
│ ├── test_resource_srv_buffer_load_sparse_feedback.glsl
│ ├── test_resource_srv_image_1d_array_load.asm
│ ├── test_resource_srv_image_1d_array_load.glsl
│ ├── test_resource_srv_image_1d_array_query.asm
│ ├── test_resource_srv_image_1d_array_query.glsl
│ ├── test_resource_srv_image_1d_array_sample.asm
│ ├── test_resource_srv_image_1d_array_sample.glsl
│ ├── test_resource_srv_image_1d_load.asm
│ ├── test_resource_srv_image_1d_load.glsl
│ ├── test_resource_srv_image_1d_query.asm
│ ├── test_resource_srv_image_1d_query.glsl
│ ├── test_resource_srv_image_1d_sample.asm
│ ├── test_resource_srv_image_1d_sample.glsl
│ ├── test_resource_srv_image_2d_array_gather.asm
│ ├── test_resource_srv_image_2d_array_gather.glsl
│ ├── test_resource_srv_image_2d_array_gather_depth.asm
│ ├── test_resource_srv_image_2d_array_gather_depth.glsl
│ ├── test_resource_srv_image_2d_array_load.asm
│ ├── test_resource_srv_image_2d_array_load.glsl
│ ├── test_resource_srv_image_2d_array_query.asm
│ ├── test_resource_srv_image_2d_array_query.glsl
│ ├── test_resource_srv_image_2d_array_sample.asm
│ ├── test_resource_srv_image_2d_array_sample.glsl
│ ├── test_resource_srv_image_2d_array_sample_depth.asm
│ ├── test_resource_srv_image_2d_array_sample_depth.glsl
│ ├── test_resource_srv_image_2d_gather.asm
│ ├── test_resource_srv_image_2d_gather.glsl
│ ├── test_resource_srv_image_2d_gather_depth.asm
│ ├── test_resource_srv_image_2d_gather_depth.glsl
│ ├── test_resource_srv_image_2d_load.asm
│ ├── test_resource_srv_image_2d_load.glsl
│ ├── test_resource_srv_image_2d_ms_array_load.asm
│ ├── test_resource_srv_image_2d_ms_array_load.glsl
│ ├── test_resource_srv_image_2d_ms_array_query.asm
│ ├── test_resource_srv_image_2d_ms_array_query.glsl
│ ├── test_resource_srv_image_2d_ms_load.asm
│ ├── test_resource_srv_image_2d_ms_load.glsl
│ ├── test_resource_srv_image_2d_ms_query.asm
│ ├── test_resource_srv_image_2d_ms_query.glsl
│ ├── test_resource_srv_image_2d_query.asm
│ ├── test_resource_srv_image_2d_query.glsl
│ ├── test_resource_srv_image_2d_sample.asm
│ ├── test_resource_srv_image_2d_sample.glsl
│ ├── test_resource_srv_image_2d_sample_depth.asm
│ ├── test_resource_srv_image_2d_sample_depth.glsl
│ ├── test_resource_srv_image_3d_load.asm
│ ├── test_resource_srv_image_3d_load.glsl
│ ├── test_resource_srv_image_3d_query.asm
│ ├── test_resource_srv_image_3d_query.glsl
│ ├── test_resource_srv_image_3d_sample.asm
│ ├── test_resource_srv_image_3d_sample.glsl
│ ├── test_resource_srv_image_cube_array_gather.asm
│ ├── test_resource_srv_image_cube_array_gather.glsl
│ ├── test_resource_srv_image_cube_array_gather_depth.asm
│ ├── test_resource_srv_image_cube_array_gather_depth.glsl
│ ├── test_resource_srv_image_cube_array_query.asm
│ ├── test_resource_srv_image_cube_array_query.glsl
│ ├── test_resource_srv_image_cube_array_sample.asm
│ ├── test_resource_srv_image_cube_array_sample.glsl
│ ├── test_resource_srv_image_cube_array_sample_depth.asm
│ ├── test_resource_srv_image_cube_array_sample_depth.glsl
│ ├── test_resource_srv_image_cube_gather.asm
│ ├── test_resource_srv_image_cube_gather.glsl
│ ├── test_resource_srv_image_cube_gather_depth.asm
│ ├── test_resource_srv_image_cube_gather_depth.glsl
│ ├── test_resource_srv_image_cube_query.asm
│ ├── test_resource_srv_image_cube_query.glsl
│ ├── test_resource_srv_image_cube_sample.asm
│ ├── test_resource_srv_image_cube_sample.glsl
│ ├── test_resource_srv_image_cube_sample_depth.asm
│ ├── test_resource_srv_image_cube_sample_depth.glsl
│ ├── test_resource_srv_image_gather_depth_sparse_feedback.asm
│ ├── test_resource_srv_image_gather_depth_sparse_feedback.glsl
│ ├── test_resource_srv_image_gather_sparse_feedback.asm
│ ├── test_resource_srv_image_gather_sparse_feedback.glsl
│ ├── test_resource_srv_image_load_sparse_feedback.asm
│ ├── test_resource_srv_image_load_sparse_feedback.glsl
│ ├── test_resource_srv_image_sample_depth_sparse_feedback.asm
│ ├── test_resource_srv_image_sample_depth_sparse_feedback.glsl
│ ├── test_resource_srv_image_sample_sparse_feedback.asm
│ ├── test_resource_srv_image_sample_sparse_feedback.glsl
│ ├── test_resource_srv_indexed_image_1d_array_load.asm
│ ├── test_resource_srv_indexed_image_1d_array_load.glsl
│ ├── test_resource_srv_indexed_image_1d_array_query.asm
│ ├── test_resource_srv_indexed_image_1d_array_query.glsl
│ ├── test_resource_srv_indexed_image_1d_array_sample.asm
│ ├── test_resource_srv_indexed_image_1d_array_sample.glsl
│ ├── test_resource_srv_indexed_image_1d_load.asm
│ ├── test_resource_srv_indexed_image_1d_load.glsl
│ ├── test_resource_srv_indexed_image_1d_query.asm
│ ├── test_resource_srv_indexed_image_1d_query.glsl
│ ├── test_resource_srv_indexed_image_1d_sample.asm
│ ├── test_resource_srv_indexed_image_1d_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_array_gather.asm
│ ├── test_resource_srv_indexed_image_2d_array_gather.glsl
│ ├── test_resource_srv_indexed_image_2d_array_gather_depth.asm
│ ├── test_resource_srv_indexed_image_2d_array_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_array_load.asm
│ ├── test_resource_srv_indexed_image_2d_array_load.glsl
│ ├── test_resource_srv_indexed_image_2d_array_query.asm
│ ├── test_resource_srv_indexed_image_2d_array_query.glsl
│ ├── test_resource_srv_indexed_image_2d_array_sample.asm
│ ├── test_resource_srv_indexed_image_2d_array_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_array_sample_depth.asm
│ ├── test_resource_srv_indexed_image_2d_array_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_gather.asm
│ ├── test_resource_srv_indexed_image_2d_gather.glsl
│ ├── test_resource_srv_indexed_image_2d_gather_depth.asm
│ ├── test_resource_srv_indexed_image_2d_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_2d_load.asm
│ ├── test_resource_srv_indexed_image_2d_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_array_load.asm
│ ├── test_resource_srv_indexed_image_2d_ms_array_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_array_query.asm
│ ├── test_resource_srv_indexed_image_2d_ms_array_query.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_load.asm
│ ├── test_resource_srv_indexed_image_2d_ms_load.glsl
│ ├── test_resource_srv_indexed_image_2d_ms_query.asm
│ ├── test_resource_srv_indexed_image_2d_ms_query.glsl
│ ├── test_resource_srv_indexed_image_2d_query.asm
│ ├── test_resource_srv_indexed_image_2d_query.glsl
│ ├── test_resource_srv_indexed_image_2d_sample.asm
│ ├── test_resource_srv_indexed_image_2d_sample.glsl
│ ├── test_resource_srv_indexed_image_2d_sample_depth.asm
│ ├── test_resource_srv_indexed_image_2d_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_3d_load.asm
│ ├── test_resource_srv_indexed_image_3d_load.glsl
│ ├── test_resource_srv_indexed_image_3d_query.asm
│ ├── test_resource_srv_indexed_image_3d_query.glsl
│ ├── test_resource_srv_indexed_image_3d_sample.asm
│ ├── test_resource_srv_indexed_image_3d_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_array_gather.asm
│ ├── test_resource_srv_indexed_image_cube_array_gather.glsl
│ ├── test_resource_srv_indexed_image_cube_array_gather_depth.asm
│ ├── test_resource_srv_indexed_image_cube_array_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_array_query.asm
│ ├── test_resource_srv_indexed_image_cube_array_query.glsl
│ ├── test_resource_srv_indexed_image_cube_array_sample.asm
│ ├── test_resource_srv_indexed_image_cube_array_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_array_sample_depth.asm
│ ├── test_resource_srv_indexed_image_cube_array_sample_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_gather.asm
│ ├── test_resource_srv_indexed_image_cube_gather.glsl
│ ├── test_resource_srv_indexed_image_cube_gather_depth.asm
│ ├── test_resource_srv_indexed_image_cube_gather_depth.glsl
│ ├── test_resource_srv_indexed_image_cube_query.asm
│ ├── test_resource_srv_indexed_image_cube_query.glsl
│ ├── test_resource_srv_indexed_image_cube_sample.asm
│ ├── test_resource_srv_indexed_image_cube_sample.glsl
│ ├── test_resource_srv_indexed_image_cube_sample_depth.asm
│ ├── test_resource_srv_indexed_image_cube_sample_depth.glsl
│ ├── test_resource_uav_buffer_load_sparse_feedback.asm
│ ├── test_resource_uav_buffer_load_sparse_feedback.glsl
│ ├── test_resource_uav_counter.asm
│ ├── test_resource_uav_counter.glsl
│ ├── test_resource_uav_counter_indexed.asm
│ ├── test_resource_uav_counter_indexed.glsl
│ ├── test_resource_uav_image_1d_array_atomic.asm
│ ├── test_resource_uav_image_1d_array_atomic.glsl
│ ├── test_resource_uav_image_1d_array_load.asm
│ ├── test_resource_uav_image_1d_array_load.glsl
│ ├── test_resource_uav_image_1d_array_query.asm
│ ├── test_resource_uav_image_1d_array_query.glsl
│ ├── test_resource_uav_image_1d_array_store.asm
│ ├── test_resource_uav_image_1d_array_store.glsl
│ ├── test_resource_uav_image_1d_atomic.asm
│ ├── test_resource_uav_image_1d_atomic.glsl
│ ├── test_resource_uav_image_1d_load.asm
│ ├── test_resource_uav_image_1d_load.glsl
│ ├── test_resource_uav_image_1d_query.asm
│ ├── test_resource_uav_image_1d_query.glsl
│ ├── test_resource_uav_image_1d_store.asm
│ ├── test_resource_uav_image_1d_store.glsl
│ ├── test_resource_uav_image_2d_array_atomic.asm
│ ├── test_resource_uav_image_2d_array_atomic.glsl
│ ├── test_resource_uav_image_2d_array_load.asm
│ ├── test_resource_uav_image_2d_array_load.glsl
│ ├── test_resource_uav_image_2d_array_query.asm
│ ├── test_resource_uav_image_2d_array_query.glsl
│ ├── test_resource_uav_image_2d_array_store.asm
│ ├── test_resource_uav_image_2d_array_store.glsl
│ ├── test_resource_uav_image_2d_atomic.asm
│ ├── test_resource_uav_image_2d_atomic.glsl
│ ├── test_resource_uav_image_2d_load.asm
│ ├── test_resource_uav_image_2d_load.glsl
│ ├── test_resource_uav_image_2d_load_precise.asm
│ ├── test_resource_uav_image_2d_load_precise.glsl
│ ├── test_resource_uav_image_2d_query.asm
│ ├── test_resource_uav_image_2d_query.glsl
│ ├── test_resource_uav_image_2d_store.asm
│ ├── test_resource_uav_image_2d_store.glsl
│ ├── test_resource_uav_image_3d_atomic.asm
│ ├── test_resource_uav_image_3d_atomic.glsl
│ ├── test_resource_uav_image_3d_load.asm
│ ├── test_resource_uav_image_3d_load.glsl
│ ├── test_resource_uav_image_3d_query.asm
│ ├── test_resource_uav_image_3d_query.glsl
│ ├── test_resource_uav_image_3d_store.asm
│ ├── test_resource_uav_image_3d_store.glsl
│ ├── test_resource_uav_image_load_sparse_feedback.asm
│ ├── test_resource_uav_image_load_sparse_feedback.glsl
│ ├── test_resource_uav_indexed_image_1d_array_atomic.asm
│ ├── test_resource_uav_indexed_image_1d_array_atomic.glsl
│ ├── test_resource_uav_indexed_image_1d_array_load.asm
│ ├── test_resource_uav_indexed_image_1d_array_load.glsl
│ ├── test_resource_uav_indexed_image_1d_array_query.asm
│ ├── test_resource_uav_indexed_image_1d_array_query.glsl
│ ├── test_resource_uav_indexed_image_1d_array_store.asm
│ ├── test_resource_uav_indexed_image_1d_array_store.glsl
│ ├── test_resource_uav_indexed_image_1d_atomic.asm
│ ├── test_resource_uav_indexed_image_1d_atomic.glsl
│ ├── test_resource_uav_indexed_image_1d_load.asm
│ ├── test_resource_uav_indexed_image_1d_load.glsl
│ ├── test_resource_uav_indexed_image_1d_query.asm
│ ├── test_resource_uav_indexed_image_1d_query.glsl
│ ├── test_resource_uav_indexed_image_1d_store.asm
│ ├── test_resource_uav_indexed_image_1d_store.glsl
│ ├── test_resource_uav_indexed_image_2d_array_atomic.asm
│ ├── test_resource_uav_indexed_image_2d_array_atomic.glsl
│ ├── test_resource_uav_indexed_image_2d_array_load.asm
│ ├── test_resource_uav_indexed_image_2d_array_load.glsl
│ ├── test_resource_uav_indexed_image_2d_array_query.asm
│ ├── test_resource_uav_indexed_image_2d_array_query.glsl
│ ├── test_resource_uav_indexed_image_2d_array_store.asm
│ ├── test_resource_uav_indexed_image_2d_array_store.glsl
│ ├── test_resource_uav_indexed_image_2d_atomic.asm
│ ├── test_resource_uav_indexed_image_2d_atomic.glsl
│ ├── test_resource_uav_indexed_image_2d_load.asm
│ ├── test_resource_uav_indexed_image_2d_load.glsl
│ ├── test_resource_uav_indexed_image_2d_query.asm
│ ├── test_resource_uav_indexed_image_2d_query.glsl
│ ├── test_resource_uav_indexed_image_2d_store.asm
│ ├── test_resource_uav_indexed_image_2d_store.glsl
│ ├── test_resource_uav_indexed_image_3d_atomic.asm
│ ├── test_resource_uav_indexed_image_3d_atomic.glsl
│ ├── test_resource_uav_indexed_image_3d_load.asm
│ ├── test_resource_uav_indexed_image_3d_load.glsl
│ ├── test_resource_uav_indexed_image_3d_query.asm
│ ├── test_resource_uav_indexed_image_3d_query.glsl
│ ├── test_resource_uav_indexed_image_3d_store.asm
│ ├── test_resource_uav_indexed_image_3d_store.glsl
│ ├── test_resources_cbv.asm
│ ├── test_resources_cbv.glsl
│ ├── test_resources_cbv_dynamic.asm
│ ├── test_resources_cbv_dynamic.glsl
│ ├── test_resources_cbv_indexed.asm
│ ├── test_resources_cbv_indexed.glsl
│ ├── test_resources_cbv_indexed_nonuniform.asm
│ ├── test_resources_cbv_indexed_nonuniform.glsl
│ ├── test_resources_srv_buffer_raw_load.asm
│ ├── test_resources_srv_buffer_raw_load.glsl
│ ├── test_resources_srv_buffer_raw_query.asm
│ ├── test_resources_srv_buffer_raw_query.glsl
│ ├── test_resources_srv_buffer_structured_load.asm
│ ├── test_resources_srv_buffer_structured_load.glsl
│ ├── test_resources_srv_buffer_structured_query.asm
│ ├── test_resources_srv_buffer_structured_query.glsl
│ ├── test_resources_srv_buffer_typed_load.asm
│ ├── test_resources_srv_buffer_typed_load.glsl
│ ├── test_resources_srv_buffer_typed_query.asm
│ ├── test_resources_srv_buffer_typed_query.glsl
│ ├── test_resources_srv_indexed_buffer_raw_load.asm
│ ├── test_resources_srv_indexed_buffer_raw_load.glsl
│ ├── test_resources_srv_indexed_buffer_raw_query.asm
│ ├── test_resources_srv_indexed_buffer_raw_query.glsl
│ ├── test_resources_srv_indexed_buffer_structured_load.asm
│ ├── test_resources_srv_indexed_buffer_structured_load.glsl
│ ├── test_resources_srv_indexed_buffer_structured_query.asm
│ ├── test_resources_srv_indexed_buffer_structured_query.glsl
│ ├── test_resources_srv_indexed_buffer_typed_load.asm
│ ├── test_resources_srv_indexed_buffer_typed_load.glsl
│ ├── test_resources_srv_indexed_buffer_typed_query.asm
│ ├── test_resources_srv_indexed_buffer_typed_query.glsl
│ ├── test_resources_uav_buffer_raw_atomic.asm
│ ├── test_resources_uav_buffer_raw_atomic.glsl
│ ├── test_resources_uav_buffer_raw_load.asm
│ ├── test_resources_uav_buffer_raw_load.glsl
│ ├── test_resources_uav_buffer_raw_load_precise.asm
│ ├── test_resources_uav_buffer_raw_load_precise.glsl
│ ├── test_resources_uav_buffer_raw_query.asm
│ ├── test_resources_uav_buffer_raw_query.glsl
│ ├── test_resources_uav_buffer_raw_store.asm
│ ├── test_resources_uav_buffer_raw_store.glsl
│ ├── test_resources_uav_buffer_structured_atomic.asm
│ ├── test_resources_uav_buffer_structured_atomic.glsl
│ ├── test_resources_uav_buffer_structured_load.asm
│ ├── test_resources_uav_buffer_structured_load.glsl
│ ├── test_resources_uav_buffer_structured_load_precise.asm
│ ├── test_resources_uav_buffer_structured_load_precise.glsl
│ ├── test_resources_uav_buffer_structured_query.asm
│ ├── test_resources_uav_buffer_structured_query.glsl
│ ├── test_resources_uav_buffer_structured_store.asm
│ ├── test_resources_uav_buffer_structured_store.glsl
│ ├── test_resources_uav_buffer_typed_atomic.asm
│ ├── test_resources_uav_buffer_typed_atomic.glsl
│ ├── test_resources_uav_buffer_typed_load.asm
│ ├── test_resources_uav_buffer_typed_load.glsl
│ ├── test_resources_uav_buffer_typed_load_precise.asm
│ ├── test_resources_uav_buffer_typed_load_precise.glsl
│ ├── test_resources_uav_buffer_typed_query.asm
│ ├── test_resources_uav_buffer_typed_query.glsl
│ ├── test_resources_uav_buffer_typed_store.asm
│ ├── test_resources_uav_buffer_typed_store.glsl
│ ├── test_resources_uav_indexed_buffer_raw_atomic.asm
│ ├── test_resources_uav_indexed_buffer_raw_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_raw_load.asm
│ ├── test_resources_uav_indexed_buffer_raw_load.glsl
│ ├── test_resources_uav_indexed_buffer_raw_query.asm
│ ├── test_resources_uav_indexed_buffer_raw_query.glsl
│ ├── test_resources_uav_indexed_buffer_raw_store.asm
│ ├── test_resources_uav_indexed_buffer_raw_store.glsl
│ ├── test_resources_uav_indexed_buffer_structured_atomic.asm
│ ├── test_resources_uav_indexed_buffer_structured_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_structured_load.asm
│ ├── test_resources_uav_indexed_buffer_structured_load.glsl
│ ├── test_resources_uav_indexed_buffer_structured_query.asm
│ ├── test_resources_uav_indexed_buffer_structured_query.glsl
│ ├── test_resources_uav_indexed_buffer_structured_store.asm
│ ├── test_resources_uav_indexed_buffer_structured_store.glsl
│ ├── test_resources_uav_indexed_buffer_typed_atomic.asm
│ ├── test_resources_uav_indexed_buffer_typed_atomic.glsl
│ ├── test_resources_uav_indexed_buffer_typed_load.asm
│ ├── test_resources_uav_indexed_buffer_typed_load.glsl
│ ├── test_resources_uav_indexed_buffer_typed_query.asm
│ ├── test_resources_uav_indexed_buffer_typed_query.glsl
│ ├── test_resources_uav_indexed_buffer_typed_store.asm
│ └── test_resources_uav_indexed_buffer_typed_store.glsl
├── roundtrip_shaders.py
├── scratch_pool.hpp
├── shaders/
│ ├── ags/
│ │ ├── ags.ssbo.comp
│ │ ├── ags_shader_intrinsics_dx12.inc
│ │ ├── cs_constexpr_wmma_gep.sm66.full-wmma.ssbo.comp
│ │ ├── cs_constexpr_wmma_gep.sm66.ssbo.comp
│ │ ├── cs_wmma_alloca.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.comp
│ │ ├── cs_wmma_copy_transpose_fp16.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_extract_insert.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_at.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_bt.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ct.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_f16_ot.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_f16_quant_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f16_strided_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_f32_16x16x16_fp8_quant_f32.sm66.ssbo.comp
│ │ ├── cs_wmma_fp16_fp8_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp16_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_fp32_fp8_conversions.sm66.ssbo.nv-coopmat2.comp
│ │ ├── cs_wmma_fp8_fp32_conversions.sm66.ssbo.full-wmma.comp
│ │ ├── cs_wmma_lds_transpose.sm66.ssbo.comp
│ │ ├── cs_wmma_matrix_length.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.full-wmma.sm66.ssbo.comp
│ │ ├── cs_wmma_store_phi.sm66.ssbo.comp
│ │ └── wmma_ags.h
│ ├── alloca-opts/
│ │ ├── bad-stride.frag
│ │ ├── double-array-load.frag
│ │ ├── float4-array-load.bindless.frag
│ │ ├── float4-array-load.bindless.root-constants.frag
│ │ ├── float4-array-load.frag
│ │ ├── float4-array-load.root-constant.frag
│ │ ├── float4-array-load.root-descriptor.frag
│ │ ├── float4-array-load.root-descriptor.root-constants.frag
│ │ ├── load-different.frag
│ │ ├── local-root-constants.local-root-signature.rgen
│ │ ├── matrix-load.frag
│ │ ├── missing-first.frag
│ │ ├── missing-last-element.frag
│ │ ├── out-of-order-load.frag
│ │ ├── store-after-load.frag
│ │ └── uint4-array-load.frag
│ ├── asm/
│ │ ├── bfi.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps-single-alias.bc.dxil
│ │ ├── cbv.no-legacy-cbuf-layout.sm66-heaps.bc.dxil
│ │ ├── constant-struct-aggregate.bc.dxil
│ │ ├── control-flow-multi-break-with-non-idom-loop-header.dxil
│ │ ├── ibfe.bc.dxil
│ │ └── ubfe.bc.dxil
│ ├── auto-barrier/
│ │ ├── complex-loop.auto-group-shared-barrier.comp
│ │ ├── inner-to-inner.auto-group-shared-barrier.comp
│ │ ├── inner-to-outer.auto-group-shared-barrier.comp
│ │ ├── outer-to-inner.auto-group-shared-barrier.comp
│ │ ├── single-block-loop.auto-group-shared-barrier.comp
│ │ └── single-block.auto-group-shared-barrier.comp
│ ├── control-flow/
│ │ ├── branch-return-2.comp
│ │ ├── branch-return.comp
│ │ ├── branch.comp
│ │ ├── conditional-break-into-if-else-if-ladder-2.comp
│ │ ├── conditional-break-into-if-else-if-ladder.comp
│ │ ├── dual-inner-loop-early-return.comp
│ │ ├── if-else-if-into-continue.comp
│ │ ├── inner-loop-early-return.comp
│ │ ├── interleaved-unrolled-loop-breaks.comp
│ │ ├── loop-break-2.comp
│ │ ├── loop-break.comp
│ │ ├── loop-continue-2.comp
│ │ ├── loop-continue-3.comp
│ │ ├── loop-continue.comp
│ │ ├── loop-inside-infinite-loop-2.frag
│ │ ├── loop-inside-infinite-loop.frag
│ │ ├── loop-return.comp
│ │ ├── loop.comp
│ │ ├── nested-loop-break-2.comp
│ │ ├── nested-loop-break.comp
│ │ ├── nested-loop.comp
│ │ ├── selection-merge-split-post-domination.frag
│ │ ├── switch-continue.frag
│ │ ├── switch-merge-into-other-merge.comp
│ │ ├── switch-shared-header-with-loop.comp
│ │ └── wave-size-dependent-loop-unroll.comp
│ ├── descriptor_qa/
│ │ ├── acceleration-structure.bindless.descriptor-qa.rgen
│ │ ├── acceleration-structure.bindless.descriptor-qa.sm66.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.descriptor-qa.rgen
│ │ ├── descriptor_qa.bindless.cbv-as-ssbo.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.comp
│ │ ├── descriptor_qa.bindless.descriptor-qa.sm66.comp
│ │ ├── descriptor_qa.bindless.ssbo.descriptor-qa.comp
│ │ ├── early-2.bindless.descriptor-qa.frag
│ │ ├── early-3.bindless.descriptor-qa.frag
│ │ ├── early-4.bindless.descriptor-qa.frag
│ │ ├── early-5.bindless.descriptor-qa.frag
│ │ ├── early-heap.descriptor-qa.sm66.frag
│ │ └── early.bindless.descriptor-qa.frag
│ ├── dxil-builtin/
│ │ ├── accept-hit-and-end-search-ignore-hit.rany
│ │ ├── acos.frag
│ │ ├── asin.frag
│ │ ├── atan.frag
│ │ ├── atomic-bin-op.bindless.root-constant.frag
│ │ ├── atomic-bin-op.frag
│ │ ├── atomic-bin-op.root-descriptor.comp
│ │ ├── atomic-bin-op.ssbo.frag
│ │ ├── atomic-compare-exchange.frag
│ │ ├── atomic-compare-exchange.root-descriptor.comp
│ │ ├── atomic-compare-exchange.ssbo.frag
│ │ ├── attributes.denorm-ftz.comp
│ │ ├── attributes.denorm-preserve.comp
│ │ ├── barrier.comp
│ │ ├── barycentrics-2.frag
│ │ ├── barycentrics.frag
│ │ ├── bfrev.frag
│ │ ├── bitcount-bitrev-sizes.ssbo.comp
│ │ ├── buffer-load-feedback.frag
│ │ ├── buffer-load-signed-feedback.frag
│ │ ├── buffer-load-signed.frag
│ │ ├── buffer-load.frag
│ │ ├── buffer-load.ssbo.frag
│ │ ├── buffer-store-signed.frag
│ │ ├── buffer-store.frag
│ │ ├── buffer-store.ssbo.frag
│ │ ├── buffer-update-counter.frag
│ │ ├── calculate-lod.frag
│ │ ├── call-shader.rgen
│ │ ├── clip.demote-to-helper.frag
│ │ ├── clip.frag
│ │ ├── compute-shader-derivatives-cube-array.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-cube.noderivs.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives-single-thread.sm66.ssbo.comp
│ │ ├── compute-shader-derivatives.noderivs.sm66.ssbo.comp
│ │ ├── cos.frag
│ │ ├── countbits.frag
│ │ ├── coverage.frag
│ │ ├── derivative.frag
│ │ ├── derivative.sm60.frag
│ │ ├── derivative.sm60.native-fp16.frag
│ │ ├── derivatives.sm66.comp
│ │ ├── discard.demote-to-helper.frag
│ │ ├── discard.frag
│ │ ├── dispatch-rays-dimensions.rgen
│ │ ├── dispatch-rays-index.rgen
│ │ ├── dot2.frag
│ │ ├── dot3.frag
│ │ ├── dot4.frag
│ │ ├── eval-centroid.frag
│ │ ├── eval-sample-index.frag
│ │ ├── eval-snapped.frag
│ │ ├── exp.frag
│ │ ├── f16-to-f32.frag
│ │ ├── f32-to-f16.frag
│ │ ├── fabs.frag
│ │ ├── firstbithi-16.sm62.frag
│ │ ├── firstbithi-64.frag
│ │ ├── firstbithi.frag
│ │ ├── firstbitlo-16.sm62.frag
│ │ ├── firstbitlo-64.frag
│ │ ├── firstbitlo.frag
│ │ ├── firstbitshi-16.sm62.frag
│ │ ├── firstbitshi-64.frag
│ │ ├── firstbitshi.frag
│ │ ├── flattened_thread_id_in_group.comp
│ │ ├── fma.frag
│ │ ├── fmad-precise.frag
│ │ ├── fmad.frag
│ │ ├── fmax.frag
│ │ ├── fmin.frag
│ │ ├── frc.frag
│ │ ├── get-dimensions-w-only.frag
│ │ ├── get-dimensions-xyz-only.frag
│ │ ├── get-dimensions.bindless.root-constant.frag
│ │ ├── get-dimensions.bindless.root-constant.ssbo.frag
│ │ ├── get-dimensions.frag
│ │ ├── get-dimensions.ssbo.frag
│ │ ├── group_id.comp
│ │ ├── hcos.frag
│ │ ├── hsin.frag
│ │ ├── htan.frag
│ │ ├── imad.frag
│ │ ├── imax.frag
│ │ ├── imin.frag
│ │ ├── instance-id.vert
│ │ ├── is-helper-lane-2.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane-2.sm66.frag
│ │ ├── is-helper-lane.demote-to-helper.sm66.frag
│ │ ├── is-helper-lane.sm66.frag
│ │ ├── isfinite.frag
│ │ ├── isinf.frag
│ │ ├── isnan.frag
│ │ ├── log.frag
│ │ ├── make-double.frag
│ │ ├── msaa-uav.sm67.comp
│ │ ├── msad.comp
│ │ ├── object-ray-direction.rany
│ │ ├── object-ray-origin.rany
│ │ ├── object-to-world-3x4.rany
│ │ ├── object-to-world-4x3.rany
│ │ ├── pack-unpack.ssbo.sm66.comp
│ │ ├── quad-all-any.sm67.comp
│ │ ├── quad-all-any.sm67.quad-maximal-reconvergence.noglsl.comp
│ │ ├── quad-read-at-2d.comp
│ │ ├── quad-read-at-2d.sm66.comp
│ │ ├── quad-read-at.comp
│ │ ├── quad-read-at.frag
│ │ ├── quad-swap.comp
│ │ ├── quad-swap.frag
│ │ ├── raw-gather-offset-sparse.sm67.ssbo.comp
│ │ ├── raw-gather-offset.sm67.ssbo.comp
│ │ ├── raw-gather-sparse.sm67.ssbo.comp
│ │ ├── raw-gather.sm67.ssbo.comp
│ │ ├── ray-query-phi-multi.invalid.sm66.comp
│ │ ├── ray-query-phi-simple.sm66.comp
│ │ ├── ray-query-select-multi.invalid.sm66.comp
│ │ ├── ray-query-select-simple.sm66.comp
│ │ ├── ray-query-store-multi.invalid.sm66.comp
│ │ ├── ray-query-store-simple.sm66.comp
│ │ ├── ray-query.comp
│ │ ├── ray-t-current.rany
│ │ ├── ray-t-min.rany
│ │ ├── render-target-sample-count.frag
│ │ ├── render-target-sample-position.frag
│ │ ├── report-hit.rint
│ │ ├── round-ne.frag
│ │ ├── round-ni.frag
│ │ ├── round-pi.frag
│ │ ├── round-z.frag
│ │ ├── rsqrt.frag
│ │ ├── rt-geometry-index.rany
│ │ ├── rt-hit-kind.rany
│ │ ├── rt-instance-id.rany
│ │ ├── rt-instance-index.rany
│ │ ├── rt-primitive-index.rany
│ │ ├── rt-ray-flags.rany
│ │ ├── sample-bias-feedback.frag
│ │ ├── sample-bias-offset.frag
│ │ ├── sample-bias.frag
│ │ ├── sample-cmp-bias-feedback.frag
│ │ ├── sample-cmp-bias-offset.frag
│ │ ├── sample-cmp-bias.frag
│ │ ├── sample-cmp-feedback.frag
│ │ ├── sample-cmp-grad-offset-feedback.frag
│ │ ├── sample-cmp-grad-offset.frag
│ │ ├── sample-cmp-grad.frag
│ │ ├── sample-cmp-level.sm67.noglsl.frag
│ │ ├── sample-cmp-levelzero.frag
│ │ ├── sample-cmp-offset-levelzero-feedback.frag
│ │ ├── sample-cmp-offset-levelzero.frag
│ │ ├── sample-cmp-offset.frag
│ │ ├── sample-cmp.frag
│ │ ├── sample-grad-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-grad-offset-feedback.frag
│ │ ├── sample-grad-offset.frag
│ │ ├── sample-grad.frag
│ │ ├── sample-id.frag
│ │ ├── sample-level-offset-feedback.frag
│ │ ├── sample-level-offset.frag
│ │ ├── sample-level.frag
│ │ ├── sample-offset-dynamic.noglsl.invalid.sm67.frag
│ │ ├── sample-offset.frag
│ │ ├── sample.frag
│ │ ├── saturate.frag
│ │ ├── sin.frag
│ │ ├── sm64-packed-arithmetic.ssbo.comp
│ │ ├── sm64-packed-arithmetic.ssbo.i8dot.noglsl.comp
│ │ ├── sm64-packed-arithmetic.ssbo.mixed-float-dot-product.noglsl.comp
│ │ ├── split-double.frag
│ │ ├── sqrt.frag
│ │ ├── tan.frag
│ │ ├── texture-gather-4offset.frag
│ │ ├── texture-gather-cmp-offset-feedback.frag
│ │ ├── texture-gather-cmp-offset.frag
│ │ ├── texture-gather-cmp.frag
│ │ ├── texture-gather-offset.frag
│ │ ├── texture-gather-signed-feedback.frag
│ │ ├── texture-gather-signed.frag
│ │ ├── texture-gather.frag
│ │ ├── texture-load-feedback.frag
│ │ ├── texture-load-offset-dynamic.sm67.frag
│ │ ├── texture-load-offset.frag
│ │ ├── texture-load-signed.frag
│ │ ├── texture-load.frag
│ │ ├── texture-store-signed.frag
│ │ ├── texture-store.frag
│ │ ├── texture2dms-sample-position.frag
│ │ ├── thread_id.comp
│ │ ├── thread_id_in_group.comp
│ │ ├── trace-ray-flags-2.rgen
│ │ ├── trace-ray-flags.rgen
│ │ ├── trace-ray.rgen
│ │ ├── umad.frag
│ │ ├── umax.frag
│ │ ├── umin.frag
│ │ ├── vertex-id.vert
│ │ ├── wave-active-all-true.comp
│ │ ├── wave-active-all-true.frag
│ │ ├── wave-active-any-true.comp
│ │ ├── wave-active-any-true.frag
│ │ ├── wave-active-ballot-discard.demote-to-helper.frag
│ │ ├── wave-active-ballot-discard.frag
│ │ ├── wave-active-ballot.comp
│ │ ├── wave-active-ballot.demote-to-helper.frag
│ │ ├── wave-active-ballot.frag
│ │ ├── wave-active-count-bits.comp
│ │ ├── wave-active-count-bits.frag
│ │ ├── wave-all-equal.comp
│ │ ├── wave-all-equal.frag
│ │ ├── wave-get-lane-count.comp
│ │ ├── wave-get-lane-index.comp
│ │ ├── wave-is-first-lane.comp
│ │ ├── wave-is-first-lane.frag
│ │ ├── wave-match.comp
│ │ ├── wave-match.frag
│ │ ├── wave-match.partitioned.noglsl.comp
│ │ ├── wave-match.partitioned.noglsl.frag
│ │ ├── wave-multi-prefix-count-bits.comp
│ │ ├── wave-multi-prefix-count-bits.frag
│ │ ├── wave-multi-prefix-op.comp
│ │ ├── wave-multi-prefix-op.frag
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.comp
│ │ ├── wave-multi-prefix-op.partitioned.noglsl.frag
│ │ ├── wave-prefix.comp
│ │ ├── wave-prefix.frag
│ │ ├── wave-read-lane-at-optimizations.comp
│ │ ├── wave-read-lane-at.comp
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.frag
│ │ ├── wave-reduce-helpers.sm67.frag
│ │ ├── wave-reduce-helpers.sm67.quad-maximal-reconvergence.frag
│ │ ├── wave-reduce.comp
│ │ ├── wave-reduce.frag
│ │ ├── wave-size.sm66.comp
│ │ ├── world-ray-direction.rany
│ │ ├── world-ray-origin.rany
│ │ ├── world-to-object-3x4.rany
│ │ └── world-to-object-4x3.rany
│ ├── fp16/
│ │ ├── saturate.frag
│ │ ├── saturate.sm60.frag
│ │ └── saturate.sm60.native-fp16.frag
│ ├── heap-robustness/
│ │ ├── misc.bindless.heap-raw-va-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.heap-robustness-cbv.sm66.ssbo.comp
│ │ ├── misc.bindless.heap-robustness.sm66.ssbo.comp
│ │ ├── misc.bindless.sm66.ssbo.comp
│ │ └── misc.heap-robustness.bindless.heap-robustness-cbv.heap-raw-va-cbv.sm66.ssbo.comp
│ ├── instrumentation/
│ │ ├── atomics-raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured-counter.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── atomics-structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── atomics-typed.bindless.bda-instrumentation.ssbo.comp
│ │ ├── cbv.bindless.bda-instrumentation.comp
│ │ ├── cbv.root-descriptor.bda-instrumentation.comp
│ │ ├── raw.bindless.bda-instrumentation.ssbo.comp
│ │ ├── raw.root-descriptor.bda-instrumentation.ssbo.comp
│ │ ├── structured.bindless.bda-instrumentation.comp
│ │ ├── structured.bindless.bda-instrumentation.ssbo.comp
│ │ ├── structured.root-descriptor.bda-instrumentation.ssbo.comp
│ │ └── typed.bindless.bda-instrumentation.comp
│ ├── llvm-builtin/
│ │ ├── alloca-robustness-cases.extended-robustness.vert
│ │ ├── alloca.frag
│ │ ├── atomic-bin-op.comp
│ │ ├── atomic-compare-exchange.comp
│ │ ├── atomic-compare-exchange.sm66.ssbo.comp
│ │ ├── bool-to-fp.frag
│ │ ├── constant-expression-cast.comp
│ │ ├── constant-expression-gep.comp
│ │ ├── fadd.frag
│ │ ├── fast-mul-div-pair.comp
│ │ ├── fcmp_eq.frag
│ │ ├── fcmp_ge.frag
│ │ ├── fcmp_gt.frag
│ │ ├── fcmp_le.frag
│ │ ├── fcmp_lt.frag
│ │ ├── fcmp_ne.frag
│ │ ├── fdiv.frag
│ │ ├── fmul.frag
│ │ ├── frem.frag
│ │ ├── fsub.frag
│ │ ├── glitched-integer-width.comp
│ │ ├── groupshared.comp
│ │ ├── icmp_eq.frag
│ │ ├── icmp_ne.frag
│ │ ├── icmp_sge.frag
│ │ ├── icmp_sgt.frag
│ │ ├── icmp_sle.frag
│ │ ├── icmp_slt.frag
│ │ ├── icmp_uge.frag
│ │ ├── icmp_ugt.frag
│ │ ├── icmp_ule.frag
│ │ ├── icmp_ult.frag
│ │ ├── logical-and.frag
│ │ ├── logical-equal.frag
│ │ ├── logical-not-equal.frag
│ │ ├── logical-or.frag
│ │ ├── lut.frag
│ │ ├── min16-phi.sm60.comp
│ │ ├── precise_math.frag
│ │ └── zext-bool.frag
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.comp
│ │ ├── uav-coherent-promotion.ssbo.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.comp
│ │ ├── uav-coherent.sm66.ssbo.comp
│ │ └── uav-coherent.ssbo.comp
│ ├── nvapi/
│ │ ├── bringup.nvapi.ssbo.rgen
│ │ ├── get-special-global-timer.nvapi.ssbo.rgen
│ │ ├── hit-object.local-root-signature.noglsl.nvapi.ssbo.rgen
│ │ ├── nvHLSLExtns.h
│ │ ├── nvHLSLExtnsInternal.h
│ │ ├── nvShaderExtnEnums.h
│ │ ├── ray-query-cluster-id.nvapi.comp
│ │ ├── rt-cluster-id.nvapi.rany
│ │ └── shuffle.nvapi.ssbo.comp
│ ├── opts/
│ │ ├── fp16-fp32-fp16-1.ssbo.comp
│ │ ├── sabs.frag
│ │ ├── sneg.frag
│ │ ├── wave-read-lane-first-heap.sm66.comp
│ │ ├── wave-read-lane-first.bindless.local-root-signature.rmiss
│ │ ├── wave-read-lane-first.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.comp
│ │ ├── wave-read-lane-first.no-legacy-cbuf-layout.sm60.comp
│ │ ├── wave-read-lane-first.sm60.comp
│ │ ├── wave-read-lane-first.sm66.comp
│ │ ├── wave-read-lane-first.ssbo.comp
│ │ ├── wave-read-lane-first.ssbo.rgen
│ │ ├── wave-read-lane-first.ssbo.sm60.comp
│ │ ├── wave-read-lane-first.ssbo.sm66.comp
│ │ └── wave-read-lane-first.ssbo.sm66.rgen
│ ├── raw-access/
│ │ ├── bab-double1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-double4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── bab-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float3.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-float4x4.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-half1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16float1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.comp
│ │ ├── structured-min16uint1.raw-access-chains.noglsl.ssbo.sm60.native-fp16.comp
│ │ ├── structured-uint1.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint2.raw-access-chains.noglsl.ssbo.comp
│ │ ├── structured-uint3.raw-access-chains.noglsl.ssbo.comp
│ │ └── structured-uint4.raw-access-chains.noglsl.ssbo.comp
│ ├── resources/
│ │ ├── acceleration-structure.bindless.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.raw-va-stride-offset.rgen
│ │ ├── acceleration-structure.bindless.ssbo-rtas.local-root-signature.rgen
│ │ ├── acceleration-structure.local-root-signature.root-descriptor.rgen
│ │ ├── basic.input-attachment.frag
│ │ ├── buffer-16bit.ssbo.bindless.comp
│ │ ├── buffer-16bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-16bit.ssbo.comp
│ │ ├── buffer-64bit.ssbo.bindless.ssbo-align.comp
│ │ ├── buffer-64bit.ssbo.comp
│ │ ├── buffer-alignment-fixup.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.comp
│ │ ├── buffer-alignment-fixup.ssbo.ssbo-align.bindless.root-constant.offset-layout.typed-buffer-offset.comp
│ │ ├── cbuf.root-constant.min16float.sm60.frag
│ │ ├── cbuf.root-constant.min16float.sm60.native-fp16.frag
│ │ ├── cbuf.root-constant.min16int.sm60.frag
│ │ ├── cbuf.root-constant.min16int.sm60.native-fp16.frag
│ │ ├── cbv-array-nonuniform.frag
│ │ ├── cbv-array.frag
│ │ ├── cbv-dynamic.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv-indexing.frag
│ │ ├── cbv-indexing.sm66.frag
│ │ ├── cbv-legacy-fp16-fp64.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.root-descriptor.sm60.native-fp16.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.frag
│ │ ├── cbv-legacy-fp16-fp64.sm60.native-fp16.frag
│ │ ├── cbv.bindless.root-constant.cbv-as-ssbo.frag
│ │ ├── cbv.bindless.root-constant.frag
│ │ ├── cbv.frag
│ │ ├── cbv.no-legacy-cbuf-layout.bindless.frag
│ │ ├── cbv.no-legacy-cbuf-layout.index-divider.frag
│ │ ├── cbv.no-legacy-cbuf-layout.local-root-signature.rmiss
│ │ ├── cbv.no-legacy-cbuf-layout.native-fp16.sm60.frag
│ │ ├── cbv.no-legacy-cbuf-layout.root-constant.frag
│ │ ├── cbv.root-constant.frag
│ │ ├── cbv.root-descriptor.no-legacy-cbuf-layout.frag
│ │ ├── combined-image-sampler-reuse.frag
│ │ ├── dynamic-root-constant.root-constant.bindless.root-descriptor.comp
│ │ ├── min16-alloca-groupshared.sm60.comp
│ │ ├── min16float-ssbo-dxr.ssbo.rgen
│ │ ├── raw-buffer-addressing.comp
│ │ ├── raw-buffer-addressing.ssbo.comp
│ │ ├── root-bda.root-descriptor.comp
│ │ ├── root-bda.root-descriptor.sm60.comp
│ │ ├── root-constant-with-bda.root-descriptor.root-constant.comp
│ │ ├── rt-resources.bindless.local-root-signature.rmiss
│ │ ├── rt-resources.bindless.rmiss
│ │ ├── rt-resources.rmiss
│ │ ├── sampler-array.frag
│ │ ├── sampler-indexing.frag
│ │ ├── sampler-indexing.sm66.frag
│ │ ├── sampler.bindless.root-constant.frag
│ │ ├── sm66/
│ │ │ ├── atomics-64bit-groupshared.ssbo.sm66.comp
│ │ │ ├── atomics-64bit.root-descriptor.sm66.comp
│ │ │ ├── atomics-64bit.ssbo.sm66.comp
│ │ │ ├── atomics-component-alias.sm66.comp
│ │ │ ├── atomics-typed-64bit-heap.sm66.comp
│ │ │ ├── atomics-typed-64bit.bindless.sm66.comp
│ │ │ ├── atomics-typed-64bit.sm66.comp
│ │ │ ├── binding-range-selection.bindless.sm66.comp
│ │ │ ├── binding-range-selection.sm66.comp
│ │ │ ├── buffer-64bit-double.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.sm66.comp
│ │ │ ├── buffer-64bit.ssbo.ssbo-align.sm66.comp
│ │ │ ├── cbuffer-heap.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.bindless.sm66.frag
│ │ │ ├── cbv.no-legacy-cbuf-layout.sm66.frag
│ │ │ ├── raw-buffer-heap.sm66.frag
│ │ │ ├── raw-buffer-heap.ssbo.sm66.frag
│ │ │ ├── raw-buffer-heap.typed-buffer-offset.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.sm66.frag
│ │ │ ├── raw-buffers-binding.ssbo.bindless.ssbo-align.sm66.frag
│ │ │ ├── raygen-heap.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen-heap.ssbo-rtas.sm66.rgen
│ │ │ ├── raygen.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.raw-va-stride-offset.sm66.rgen
│ │ │ ├── raygen.ssbo-rtas.bindless.sm66.rgen
│ │ │ ├── rw-typed-binding.sm66.frag
│ │ │ ├── rw-typed-heap.sm66.frag
│ │ │ ├── sampled-types-binding.sm66.frag
│ │ │ ├── sampled-types.sm66.frag
│ │ │ ├── sampler-binding.sm66.frag
│ │ │ ├── sampler-heap.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.sm66.frag
│ │ │ ├── structured-16bit-heap.ssbo.ssbo-align.sm66.frag
│ │ │ ├── structured-buffer-heap.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.sm66.frag
│ │ │ ├── structured-buffer-heap.ssbo.ssbo-align.sm66.frag
│ │ │ └── structured-buffer-heap.typed-buffer-offset.sm66.frag
│ │ ├── srv-array-raw-buffer-nonuniform.frag
│ │ ├── srv-array-raw-buffer.frag
│ │ ├── srv-array-structured-buffer-nonuniform.frag
│ │ ├── srv-array-structured-buffer.frag
│ │ ├── srv-array-texture-nonuniform.frag
│ │ ├── srv-array-texture.frag
│ │ ├── srv-array-typed-buffer-nonuniform.frag
│ │ ├── srv-array-typed-buffer.frag
│ │ ├── srv-indexing.frag
│ │ ├── srv-indexing.sm66.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.frag
│ │ ├── srv-raw-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-raw-buffer.ssbo.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.frag
│ │ ├── srv-structured-buffer.bindless.root-constant.ssbo.frag
│ │ ├── srv-structured-buffer.ssbo.frag
│ │ ├── srv-texture.bindless.root-constant.frag
│ │ ├── srv-texture.bindless.root-constant.inline-ubo.frag
│ │ ├── srv-typed-buffer.bindless.root-constant.frag
│ │ ├── srv-uav-raw.typed-buffer-offset.comp
│ │ ├── srv-uav.typed-buffer-offset.comp
│ │ ├── ssbo-minprecision.sm60.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.native-fp16.root-descriptor.frag
│ │ ├── ssbo-minprecision.sm60.ssbo.root-descriptor.frag
│ │ ├── subobject-parsing.rgen
│ │ ├── typed-resources-16bit-sparse.frag
│ │ ├── typed-resources-16bit.bindless.frag
│ │ ├── typed-resources-16bit.frag
│ │ ├── typed-resources-16bit.sm60.bindless.frag
│ │ ├── typed-resources-16bit.sm60.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.bindless.frag
│ │ ├── typed-resources-16bit.sm60.native-fp16.frag
│ │ ├── uav-array-raw-buffer-nonuniform.frag
│ │ ├── uav-array-raw-buffer.frag
│ │ ├── uav-array-structured-buffer-nonuniform.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.bindless.root-constant.frag
│ │ ├── uav-array-structured-buffer-nonuniform.ssbo.frag
│ │ ├── uav-array-structured-buffer.frag
│ │ ├── uav-array-texture-nonuniform.frag
│ │ ├── uav-array-texture.frag
│ │ ├── uav-array-typed-buffer-nonuniform.frag
│ │ ├── uav-array-typed-buffer.frag
│ │ ├── uav-counter-array.ssbo.frag
│ │ ├── uav-counter-array.ssbo.sm66.frag
│ │ ├── uav-counter-array.ssbo.sm66.uav-counter-ssbo.frag
│ │ ├── uav-counter-array.ssbo.uav-counter-ssbo.frag
│ │ ├── uav-counter-heap.sm66.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-ssbo.bindless.ssbo.frag
│ │ ├── uav-counter-heap.sm66.uav-counter-texel-buffer.bindless.ssbo.frag
│ │ ├── uav-counter.bindless.nobda.root-constant.comp
│ │ ├── uav-counter.bindless.nobda.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.comp
│ │ ├── uav-counter.bindless.root-constant.raw-va-stride-offset.heap-raw-va-cbv.comp
│ │ ├── uav-counter.bindless.root-constant.uav-counter-ssbo.comp
│ │ ├── uav-counter.ssbo.comp
│ │ ├── uav-counter.ssbo.raw-va-stride-offset.comp
│ │ ├── uav-counter.ssbo.uav-counter-ssbo.comp
│ │ ├── uav-indexing.frag
│ │ ├── uav-indexing.sm66.frag
│ │ ├── uav-raw-buffer.bindless.root-constant.frag
│ │ ├── uav-raw-buffer.ssbo.frag
│ │ ├── uav-structured-buffer.bindless.root-constant.frag
│ │ ├── uav-typed-buffer.bindless.root-constant.frag
│ │ └── uav-typed.typed-uav-without-format.comp
│ ├── rov/
│ │ ├── rov-bab.bindless.frag
│ │ ├── rov-bab.frag
│ │ ├── rov-bab.ssbo.bindless.frag
│ │ ├── rov-bab.ssbo.frag
│ │ ├── rov-bab.ssbo.root-descriptor.frag
│ │ ├── rov-branch-early-return.frag
│ │ ├── rov-branch.frag
│ │ ├── rov-buffer.frag
│ │ ├── rov-inloop-2.frag
│ │ ├── rov-inloop.frag
│ │ ├── rov-per-sample.sm66.frag
│ │ ├── rov-postloop.frag
│ │ ├── rov-structured.bindless.frag
│ │ ├── rov-structured.frag
│ │ ├── rov-structured.ssbo.bindless.frag
│ │ ├── rov-structured.ssbo.frag
│ │ ├── rov-structured.ssbo.root-descriptor.frag
│ │ ├── rov-tex1d.bindless.frag
│ │ ├── rov-tex1d.frag
│ │ ├── rov-tex1darray.bindless.frag
│ │ ├── rov-tex1darray.frag
│ │ ├── rov-tex2d.bindless.frag
│ │ ├── rov-tex2d.frag
│ │ ├── rov-tex2darray.bindless.frag
│ │ ├── rov-tex2darray.frag
│ │ ├── rov-tex3d.bindless.frag
│ │ ├── rov-tex3d.frag
│ │ ├── rov-undef.frag
│ │ └── rov.sm66.frag
│ ├── sampler-feedback/
│ │ ├── sampler-feedback.frag
│ │ └── sampler-feedback.sm66.frag
│ ├── semantics/
│ │ ├── clip-cull-distance.vert
│ │ ├── clip-cull.frag
│ │ ├── clip-distance-cols.frag
│ │ ├── clip-distance-cols.vert
│ │ ├── clip-distance-flatten.frag
│ │ ├── clip-distance-flatten.vert
│ │ ├── clip-distance-rows.frag
│ │ ├── clip-distance-rows.vert
│ │ ├── clip-distance-single.vert
│ │ ├── coverage.frag
│ │ ├── depth-greater-equal.frag
│ │ ├── depth-less-equal.frag
│ │ ├── depth.frag
│ │ ├── early-depth-stencil.frag
│ │ ├── inner-coverage.noglsl.frag
│ │ ├── is-front-face.frag
│ │ ├── position.frag
│ │ ├── primitive-id.frag
│ │ ├── primitive-id.geom
│ │ ├── render-target-array-index.frag
│ │ ├── render-target-array-index.geom
│ │ ├── sample-rate-pos.frag
│ │ ├── stencil-ref.frag
│ │ ├── sv-shading-rate.noglsl.frag
│ │ ├── sv-shading-rate.noglsl.vert
│ │ ├── view-id.frag
│ │ ├── view-id.vert
│ │ ├── viewport-array-index.frag
│ │ └── viewport-array-index.geom
│ ├── stages/
│ │ ├── boolean-io.vert
│ │ ├── callable-chain.rcall
│ │ ├── callable.rcall
│ │ ├── closesthit.rclosest
│ │ ├── domain-clip-cull.tese
│ │ ├── domain-patch-input-integer-io.tese
│ │ ├── domain.tese
│ │ ├── extra_output.dual-source-blending.frag
│ │ ├── extra_output_reordered.dual-source-blending.frag
│ │ ├── geometry-clip-cull.geom
│ │ ├── geometry-input-line.geom
│ │ ├── geometry-input-lineadj.geom
│ │ ├── geometry-input-point.geom
│ │ ├── geometry-input-triangle.geom
│ │ ├── geometry-input-triangleadj.geom
│ │ ├── geometry-instancing.geom
│ │ ├── geometry-output-line.geom
│ │ ├── geometry-output-point.geom
│ │ ├── geometry-streams.geom
│ │ ├── hull-arrays.tesc
│ │ ├── hull-clip-cull.tesc
│ │ ├── hull-patch-output-integer-io.tesc
│ │ ├── hull-single-cp.tesc
│ │ ├── hull.tesc
│ │ ├── mesh-basic-line.mesh
│ │ ├── mesh-basic.mesh
│ │ ├── mesh-clip-cull.mesh
│ │ ├── raygen-complex-storage-class.rgen
│ │ ├── raygen-skip-inactive-resources.rgen
│ │ ├── raygen.rgen
│ │ ├── raymiss-chain.rmiss
│ │ ├── raymiss.rmiss
│ │ ├── simple.dual-source-blending.frag
│ │ ├── simple.invariant.vert
│ │ ├── stage-input-output.16bit-io.frag
│ │ ├── stage-input-output.frag
│ │ ├── stream-out.stream-out.vert
│ │ ├── swizzle.rt-swizzle.frag
│ │ ├── task-basic.task
│ │ ├── vertex-array-input.vert
│ │ ├── vertex-array-output.vert
│ │ └── vertex-input-remapping.vert
│ ├── vectorization/
│ │ ├── copy-byte-address.ssbo.comp
│ │ ├── copy-composite-2.ssbo.comp
│ │ ├── copy-composite.ssbo.comp
│ │ ├── copy-composite.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double2.ssbo.comp
│ │ ├── copy-double2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double3.ssbo.comp
│ │ ├── copy-double3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-double4.ssbo.comp
│ │ ├── copy-float2.ssbo.comp
│ │ ├── copy-float2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float2x2.ssbo.comp
│ │ ├── copy-float3.ssbo.comp
│ │ ├── copy-float3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-float4x4.ssbo.comp
│ │ ├── copy-half2.ssbo.comp
│ │ ├── copy-half2.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half3.ssbo.comp
│ │ ├── copy-half3.ssbo.ssbo-align.bindless.comp
│ │ ├── copy-half4.ssbo.comp
│ │ └── copy-half4.ssbo.ssbo-align.bindless.comp
│ ├── view-instancing/
│ │ ├── geom/
│ │ │ ├── basic.view-instancing.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.last-pre-raster.geom
│ │ │ ├── basic.view-instancing.view-instancing-multiview.view-instancing-viewport-offset.last-pre-raster.geom
│ │ │ └── basic.view-instancing.view-instancing-viewport-offset.last-pre-raster.geom
│ │ ├── mesh/
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-export-viewport-layer.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ ├── basic-few-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic-many-thread.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instance-mask.mesh
│ │ │ ├── basic.view-instancing.last-pre-raster.view-instancing-viewport-offset.mesh
│ │ │ └── basic.view-instancing.mesh
│ │ ├── tesc/
│ │ │ ├── basic.view-instancing.tesc
│ │ │ └── basic.view-instancing.view-instancing-multiview.tesc
│ │ ├── tese/
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain-export-layer-viewport.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.last-pre-raster.tese
│ │ │ ├── domain.view-instancing.view-instancing-multiview.tese
│ │ │ ├── domain.view-instancing.view-instancing-viewport-offset.last-pre-raster.tese
│ │ │ └── domain.view-instancing.view-instancing-viewport-offset.tese
│ │ └── vert/
│ │ ├── basic.view-instancing.export-layer-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer-viewport.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-layer.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-layer.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-layer.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.export-viewport.last-pre-raster.vert
│ │ ├── basic.view-instancing.export-viewport.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-multiview.vert
│ │ ├── basic.view-instancing.export-viewport.view-instancing-viewport-offset.vert
│ │ ├── basic.view-instancing.last-pre-raster.vert
│ │ ├── basic.view-instancing.vert
│ │ ├── basic.view-instancing.view-instance-mask.last-pre-raster.vert
│ │ ├── basic.view-instancing.view-instance-mask.vert
│ │ ├── basic.view-instancing.view-instancing-multiview.vert
│ │ └── basic.view-instancing.view-instancing-viewport-offset.vert
│ └── vkmm/
│ ├── coopmat.sm66.ssbo.vkmm.comp
│ ├── cross_group_sharing.vkmm.node.inline-ubo.comp
│ ├── descriptor_qa.bindless.descriptor-qa.vkmm.comp
│ ├── groupshared.vkmm.comp
│ ├── hull.vkmm.tesc
│ ├── image-load-store.vkmm.comp
│ ├── image-load-store.vkmm.sm66.comp
│ ├── memory-model/
│ │ ├── uav-coherent-promotion.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.bindless.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.sm66.ssbo.vkmm.comp
│ │ ├── uav-coherent-promotion.ssbo.vkmm.comp
│ │ ├── uav-coherent.root-descriptor.ssbo.vkmm.comp
│ │ ├── uav-coherent.sm66.ssbo.vkmm.comp
│ │ └── uav-coherent.ssbo.vkmm.comp
│ ├── report-hit.vkmm.rint
│ ├── rov-structured.vkmm.frag
│ ├── rov-tex2d.vkmm.frag
│ └── wmma_ags.h
├── show_graph.py
├── spirv_module.cpp
├── spirv_module.hpp
├── spirv_module_instrumentation.cpp
├── spirv_module_instrumentation.hpp
├── test_shaders.py
├── third_party/
│ ├── CMakeLists.txt
│ ├── bc-decoder/
│ │ ├── llvm_bitreader.h
│ │ ├── llvm_decoder.cpp
│ │ └── llvm_decoder.h
│ ├── cli_parser/
│ │ ├── cli_parser.cpp
│ │ └── cli_parser.hpp
│ └── glslang-spirv/
│ ├── InReadableOrder.cpp
│ ├── Logger.cpp
│ ├── Logger.h
│ ├── SpvBuilder.cpp
│ ├── SpvBuilder.h
│ └── spvIR.h
└── util/
├── thread_local_allocator.cpp
└── thread_local_allocator.hpp
Showing preview only (209K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2179 symbols across 108 files)
FILE: bc/cast.hpp
type LLVMBC (line 34) | namespace LLVMBC
type ModuleParseContext (line 36) | struct ModuleParseContext
function T (line 39) | inline T *cast(Type *type)
function T (line 50) | inline const T *cast(const Type *type)
function T (line 61) | inline T *dyn_cast(Type *type)
function T (line 73) | inline const T *dyn_cast(const Type *type)
function isa (line 85) | inline bool isa(const Type *type)
class ValueProxy (line 90) | class ValueProxy : public Value
method ValueKind (line 93) | static constexpr ValueKind get_value_kind()
type Internal (line 110) | namespace Internal
function Value (line 187) | inline Value *resolve_proxy(Value *value)
function Value (line 194) | inline const Value *resolve_proxy(const Value *value)
function T (line 117) | inline T *cast(Value *value)
function T (line 132) | inline const T *cast(const Value *value)
function T (line 147) | inline T *dyn_cast(Value *value)
function T (line 162) | inline const T *dyn_cast(const Value *value)
function isa (line 177) | inline bool isa(const Value *value)
type Internal (line 185) | namespace Internal
function Value (line 187) | inline Value *resolve_proxy(Value *value)
function Value (line 194) | inline const Value *resolve_proxy(const Value *value)
function T (line 203) | inline T *cast(MDOperand &md)
function T (line 215) | inline T *cast(MDOperand *md)
function T (line 227) | inline const T *cast(const MDOperand &md)
function T (line 239) | inline const T *cast(const MDOperand *md)
function T (line 251) | inline T *dyn_cast(MDOperand &md)
function T (line 260) | inline T *dyn_cast(MDOperand *md)
function T (line 272) | inline const T *dyn_cast(const MDOperand &md)
function T (line 281) | inline const T *dyn_cast(const MDOperand *md)
function isa (line 293) | inline bool isa(const MDOperand &md)
function isa (line 299) | inline bool isa(const MDOperand *md)
FILE: bc/context.cpp
type LLVMBC (line 28) | namespace LLVMBC
FILE: bc/context.hpp
type LLVMBC (line 32) | namespace LLVMBC
class Type (line 34) | class Type
class LLVMContext (line 36) | class LLVMContext
method LLVMContext (line 42) | LLVMContext(const LLVMContext &) = delete;
method T (line 45) | T *construct(U &&... u)
method T (line 58) | T *construct_n(size_t n, const U &... u)
type Deleter (line 81) | struct Deleter
type TypedDeleter (line 88) | struct TypedDeleter : Deleter
method TypedDeleter (line 90) | explicit TypedDeleter(T *ptr_)
method run (line 94) | void run() override
method T (line 112) | T *construct_trivial(U &&... u)
method append_typed_destructor (line 122) | void append_typed_destructor(T *ptr)
FILE: bc/data_structures.hpp
type LLVMBC (line 29) | namespace LLVMBC
FILE: bc/disassembler.cpp
type LLVMBC (line 37) | namespace LLVMBC
type StreamState (line 39) | struct StreamState
method append (line 105) | void append(T &&t, Ts &&... ts)
method append (line 113) | typename std::enable_if<std::is_integral<T>::value, void>::type appe...
method append (line 120) | void append(char (&str)[N])
function disassemble (line 978) | bool disassemble(Module &module, String &str)
FILE: bc/function.cpp
type LLVMBC (line 33) | namespace LLVMBC
function String (line 43) | const String &Function::getName() const
function FunctionType (line 53) | FunctionType *Function::getFunctionType() const
function BasicBlock (line 68) | BasicBlock &Function::getEntryBlock() const
function String (line 78) | String Attribute::getValueAsString() const
function Attribute (line 92) | Attribute Function::getFnAttribute(const char *attribute) const
function Instruction (line 143) | Instruction *BasicBlock::getTerminator() const
function BasicBlock (line 162) | BasicBlock *BasicBlock::get_merge_bb() const
function BasicBlock (line 167) | BasicBlock *BasicBlock::get_continue_bb() const
FILE: bc/function.hpp
type LLVMBC (line 30) | namespace LLVMBC
class LLVMContext (line 32) | class LLVMContext
class Instruction (line 33) | class Instruction
class Module (line 34) | class Module
class FunctionType (line 35) | class FunctionType
class BasicBlock (line 37) | class BasicBlock : public Value
method ValueKind (line 40) | static constexpr ValueKind get_value_kind()
type Merge (line 54) | enum class Merge
function succ_begin (line 79) | inline Vector<BasicBlock *>::const_iterator succ_begin(const BasicBloc...
function succ_end (line 84) | inline Vector<BasicBlock *>::const_iterator succ_end(const BasicBlock ...
class Attribute (line 89) | class Attribute
class Function (line 99) | class Function : public Constant
method ValueKind (line 102) | static constexpr ValueKind get_value_kind()
FILE: bc/instruction.cpp
type LLVMBC (line 29) | namespace LLVMBC
function Value (line 46) | Value *Instruction::getOperand(unsigned index) const
function MDNode (line 102) | MDNode *Instruction::getMetadata(const String &str) const
function Function (line 200) | Function *CallInst::getCalledFunction() const
function Value (line 205) | Value *ReturnInst::getReturnValue() const
function Value (line 237) | Value *ExtractValueInst::getAggregateOperand() const
function Value (line 302) | Value *BranchInst::getCondition() const
function BasicBlock (line 307) | BasicBlock *BranchInst::getSuccessor(unsigned index) const
function BasicBlock (line 342) | BasicBlock *SwitchInst::getDefaultDest() const
function Value (line 347) | Value *SwitchInst::getCondition() const
function ConstantInt (line 352) | ConstantInt *SwitchInst::Case::getCaseValue() const
function BasicBlock (line 357) | BasicBlock *SwitchInst::Case::getCaseSuccessor() const
function Value (line 384) | Value *AllocaInst::getArraySize() const
function Value (line 407) | Value *LoadInst::getPointerOperand() const
function BasicBlock (line 418) | BasicBlock *PHINode::getIncomingBlock(unsigned index) const
function Value (line 425) | Value *PHINode::getIncomingValue(unsigned index) const
function Value (line 455) | Value *AtomicRMWInst::getPointerOperand() const
function Value (line 460) | Value *AtomicRMWInst::getValOperand() const
function Value (line 483) | Value *AtomicCmpXchgInst::getPointerOperand() const
function Value (line 488) | Value *AtomicCmpXchgInst::getCompareOperand() const
function Value (line 493) | Value *AtomicCmpXchgInst::getNewValOperand() const
function Value (line 521) | Value *ExtractElementInst::getVectorOperand() const
function Value (line 526) | Value *ExtractElementInst::getIndexOperand() const
FILE: bc/instruction.hpp
class FunctionType (line 31) | class FunctionType
class Function (line 32) | class Function
class BasicBlock (line 33) | class BasicBlock
class MDNode (line 34) | class MDNode
class Instruction (line 36) | class Instruction : public Value
type Predicate (line 41) | enum Predicate
type CastOps (line 72) | enum CastOps
type GEPOps (line 90) | enum GEPOps
type BinaryOps (line 95) | enum BinaryOps
method ValueKind (line 133) | static constexpr ValueKind get_value_kind()
class ReturnInst (line 146) | class ReturnInst : public Instruction
method ValueKind (line 149) | static constexpr ValueKind get_value_kind()
function ValueKind (line 165) | static constexpr ValueKind get_value_kind()
class CallInst (line 174) | class CallInst : public Instruction
method ValueKind (line 177) | static constexpr ValueKind get_value_kind()
class UnaryOperator (line 190) | class UnaryOperator : public Instruction
type UnaryOps (line 193) | enum class UnaryOps
method ValueKind (line 200) | static constexpr ValueKind get_value_kind()
class BinaryOperator (line 213) | class BinaryOperator : public Instruction
method ValueKind (line 216) | static constexpr ValueKind get_value_kind()
class CastInst (line 233) | class CastInst : public Instruction
method ValueKind (line 236) | static constexpr ValueKind get_value_kind()
function ValueKind (line 252) | static constexpr ValueKind get_value_kind()
class ExtractValueInst (line 261) | class ExtractValueInst : public Instruction
method ValueKind (line 264) | static constexpr ValueKind get_value_kind()
class AllocaInst (line 279) | class AllocaInst : public Instruction
method ValueKind (line 282) | static constexpr ValueKind get_value_kind()
class GetElementPtrInst (line 295) | class GetElementPtrInst : public Instruction
method ValueKind (line 298) | static constexpr ValueKind get_value_kind()
function ValueKind (line 314) | static constexpr ValueKind get_value_kind()
function ValueKind (line 327) | static constexpr ValueKind get_value_kind()
class CmpInst (line 336) | class CmpInst : public Instruction
method ValueKind (line 339) | static constexpr ValueKind get_value_kind()
function ValueKind (line 355) | static constexpr ValueKind get_value_kind()
class ICmpInst (line 364) | class ICmpInst : public CmpInst
method ValueKind (line 367) | static constexpr ValueKind get_value_kind()
class BranchInst (line 376) | class BranchInst : public Instruction
method ValueKind (line 379) | static constexpr ValueKind get_value_kind()
class SwitchInst (line 400) | class SwitchInst : public Instruction
method ValueKind (line 403) | static constexpr ValueKind get_value_kind()
type Case (line 410) | struct Case
class PHINode (line 433) | class PHINode : public Instruction
method ValueKind (line 436) | static constexpr ValueKind get_value_kind()
class AtomicRMWInst (line 460) | class AtomicRMWInst : public Instruction
type BinOp (line 463) | enum class BinOp
method ValueKind (line 480) | static constexpr ValueKind get_value_kind()
class AtomicCmpXchgInst (line 498) | class AtomicCmpXchgInst : public Instruction
method ValueKind (line 501) | static constexpr ValueKind get_value_kind()
class ShuffleVectorInst (line 519) | class ShuffleVectorInst : public Instruction
method ValueKind (line 523) | static constexpr ValueKind get_value_kind()
class ExtractElementInst (line 536) | class ExtractElementInst : public Instruction
method ValueKind (line 539) | static constexpr ValueKind get_value_kind()
function ValueKind (line 557) | static constexpr ValueKind get_value_kind()
class CompositeConstructInst (line 566) | class CompositeConstructInst : public Instruction
method ValueKind (line 569) | static constexpr ValueKind get_value_kind()
FILE: bc/iterator.hpp
type LLVMBC (line 29) | namespace LLVMBC
type IteratorAdaptor (line 33) | struct IteratorAdaptor
method IteratorAdaptor (line 35) | IteratorAdaptor(Iter iter_)
method T (line 40) | T &operator*()
method T (line 45) | T *operator->()
method IteratorAdaptor (line 50) | IteratorAdaptor operator++()
FILE: bc/metadata.cpp
type LLVMBC (line 31) | namespace LLVMBC
function Module (line 44) | Module *MDOperand::getParent() const
function MetadataKind (line 49) | MetadataKind MDOperand::get_metadata_kind() const
function MDOperand (line 65) | MDOperand &MDNode::getOperand(unsigned index) const
function MDNode (line 93) | MDNode *NamedMDNode::getOperand(unsigned index) const
function String (line 99) | const String &NamedMDNode::getName() const
function Constant (line 110) | Constant *ConstantAsMetadata::getValue() const
function String (line 121) | const String &MDString::getString() const
FILE: bc/metadata.hpp
type LLVMBC (line 29) | namespace LLVMBC
class Value (line 31) | class Value
class Module (line 32) | class Module
class Constant (line 33) | class Constant
type MetadataKind (line 35) | enum class MetadataKind
class MDOperand (line 44) | class MDOperand
class MDNode (line 63) | class MDNode : public MDOperand
method MetadataKind (line 66) | static constexpr MetadataKind get_metadata_kind()
class NamedMDNode (line 83) | class NamedMDNode : public MDOperand
method MetadataKind (line 86) | static constexpr MetadataKind get_metadata_kind()
class ConstantAsMetadata (line 101) | class ConstantAsMetadata : public MDOperand
method MetadataKind (line 104) | static constexpr MetadataKind get_metadata_kind()
class MDString (line 115) | class MDString : public MDOperand
method MetadataKind (line 118) | static constexpr MetadataKind get_metadata_kind()
FILE: bc/module.cpp
type LLVMBC (line 38) | namespace LLVMBC
type KnownBlocks (line 40) | enum class KnownBlocks : uint32_t
type AttributeRecord (line 58) | enum class AttributeRecord : uint32_t
type ModuleRecord (line 69) | enum class ModuleRecord : uint32_t
type ConstantsRecord (line 78) | enum class ConstantsRecord : uint32_t
type FunctionRecord (line 96) | enum class FunctionRecord : uint32_t
type ValueSymtabRecord (line 148) | enum class ValueSymtabRecord : uint32_t
type MetaDataRecord (line 156) | enum class MetaDataRecord : uint32_t
type AttributeCodes (line 201) | enum class AttributeCodes : uint32_t
type TypeRecord (line 208) | enum class TypeRecord : uint32_t
type UnaryOp (line 230) | enum class UnaryOp : uint32_t
type BinOp (line 235) | enum class BinOp : uint32_t
type AtomicBinOp (line 252) | enum class AtomicBinOp : uint32_t
type CastOp (line 269) | enum class CastOp : uint32_t
type CallFlagBits (line 286) | enum CallFlagBits
type FastMathFlagBits (line 296) | enum FastMathFlagBits
function decode_sign_rotated_value (line 302) | static int64_t decode_sign_rotated_value(uint64_t v)
type ModuleParseContext (line 311) | struct ModuleParseContext
function Value (line 413) | Value *ValueProxy::get_proxy_value() const
function BasicBlock (line 444) | BasicBlock *ModuleParseContext::get_basic_block(uint64_t index) const
function Value (line 455) | Value *ModuleParseContext::get_value(uint64_t op, Type *expected_type,...
function Value (line 487) | Value *ModuleParseContext::get_value(const Vector<uint64_t> &ops, unsi...
function Instruction (line 521) | Instruction *ModuleParseContext::get_instruction(uint64_t index) const
function MDOperand (line 532) | MDOperand *ModuleParseContext::get_metadata(uint64_t index) const
function Value (line 553) | Value *ModuleParseContext::get_value_signed(uint64_t op, Type *expecte...
function Type (line 603) | Type *ModuleParseContext::get_constant_type()
function Type (line 611) | static Type *resolve_gep_element_type(Type *type, const Vector<Value *...
function translate_binop (line 648) | static BinaryOperator::BinaryOps translate_binop(BinOp op, Type *type)
function translate_castop (line 684) | static Instruction::CastOps translate_castop(CastOp op)
function translate_uop (line 1269) | static UnaryOperator::UnaryOps translate_uop(UnaryOp op, Type *type)
function translate_atomic_binop (line 1278) | static AtomicRMWInst::BinOp translate_atomic_binop(AtomicBinOp op)
function decode_linkage (line 2082) | static GlobalVariable::LinkageTypes decode_linkage(uint64_t v)
function Type (line 2189) | Type *ModuleParseContext::get_type(uint64_t index)
function Function (line 2227) | Function *Module::getFunction(const String &name) const
function NamedMDNode (line 2238) | NamedMDNode *Module::getNamedMetadata(const String &name) const
function String (line 2248) | const String &Module::get_value_name(uint64_t id) const
function LLVMContext (line 2257) | LLVMContext &Module::getContext()
function Module (line 2307) | Module *parseIR(LLVMContext &context, const void *data, size_t size)
FILE: bc/module.hpp
type dxbc_spv (line 27) | namespace dxbc_spv
type ir (line 29) | namespace ir
class Builder (line 31) | class Builder
type LLVMBC (line 46) | namespace LLVMBC
class Function (line 48) | class Function
class LLVMContext (line 49) | class LLVMContext
class Type (line 50) | class Type
class Instruction (line 51) | class Instruction
class Function (line 52) | class Function
class BasicBlock (line 53) | class BasicBlock
class GlobalVariable (line 54) | class GlobalVariable
class NamedMDNode (line 55) | class NamedMDNode
class MDNode (line 56) | class MDNode
class Module (line 58) | class Module
FILE: bc/module_dxbc_ir.cpp
class ScopedLogger (line 43) | class ScopedLogger : util::Logger
method message (line 48) | virtual void message(util::LogLevel severity, const char* text)
method getMinimumSeverity (line 59) | virtual util::LogLevel getMinimumSeverity()
type LLVMBC (line 66) | namespace LLVMBC
function for_all_opcodes (line 69) | static void for_all_opcodes(ir::Builder &builder, ir::OpCode opcode, c...
function convert_input_primitive_type (line 98) | static DXIL::InputPrimitive convert_input_primitive_type(ir::Primitive...
function convert_output_primitive_type (line 117) | static DXIL::PrimitiveTopology convert_output_primitive_type(ir::Primi...
function convert_resource_kind (line 132) | static DXIL::ResourceKind convert_resource_kind(ir::ResourceKind kind)
function convert_builtin_opcode (line 166) | static DXIL::Op convert_builtin_opcode(ir::BuiltIn builtin)
function convert_semantic (line 190) | static DXIL::Semantic convert_semantic(ir::BuiltIn builtin)
function convert_interpolation_mode (line 242) | static DXIL::InterpolationMode convert_interpolation_mode(ir::Interpol...
function convert_atomic_binop (line 259) | static DXIL::AtomicBinOp convert_atomic_binop(ir::AtomicOp binop)
function convert_atomic_binop_llvm (line 294) | static AtomicRMWInst::BinOp convert_atomic_binop_llvm(ir::AtomicOp binop)
function convert_round_mode (line 329) | static DXIL::Op convert_round_mode(ir::RoundMode mode)
type ComponentMapping (line 344) | struct ComponentMapping
function ComponentMapping (line 351) | static ComponentMapping convert_component_mapping(const ir::Type &type...
function convert_hull_domain (line 420) | static DXIL::TessellatorDomain convert_hull_domain(ir::PrimitiveType t...
function convert_hull_partitioning (line 435) | static DXIL::TessellatorPartitioning convert_hull_partitioning(ir::Tes...
function convert_hull_output_primitive (line 450) | static DXIL::TessellatorOutputPrimitive convert_hull_output_primitive(...
type DXILIntrinsicTable (line 467) | struct DXILIntrinsicTable
type FunctionOverload (line 469) | struct FunctionOverload
type FunctionEntry (line 476) | struct FunctionEntry
function Function (line 491) | Function *DXILIntrinsicTable::get(
class ParseContext (line 513) | class ParseContext
method ParseContext (line 516) | ParseContext(LLVMContext &context_, ir::Builder &builder_, Module &m...
method MDNode (line 541) | MDNode *create_md_node(Ops&&... ops)
type MetadataMapping (line 556) | struct MetadataMapping
type StageIOHandler (line 678) | struct StageIOHandler
type StageIOAccess (line 686) | struct StageIOAccess
type ResourceHandler (line 694) | struct ResourceHandler
function Type (line 714) | static inline Type *get_value_type(Value *value)
function Type (line 720) | static Type *get_scalar_type(Type *type)
function Instruction (line 731) | Instruction *ParseContext::build_dxil_call(DXIL::Op op, Type *return_t...
function Instruction (line 744) | Instruction *ParseContext::build_dxil_call(DXIL::Op op, Type *return_t...
function Type (line 861) | Type *ParseContext::convert_type(const ir::Type &type)
function io_decl_is_patch (line 987) | static bool io_decl_is_patch(ir::ShaderStage stage, const ir::Op &op)
function Instruction (line 1819) | Instruction *ParseContext::build_load_input(
function Instruction (line 1833) | Instruction *ParseContext::build_load_output(
function Instruction (line 1855) | Instruction *ParseContext::build_store_output(uint32_t index, Value *r...
function Instruction (line 1868) | Instruction *ParseContext::build_load_builtin(DXIL::Op opcode, ir::Ssa...
function Value (line 1883) | Value *ParseContext::get_extracted_composite_component(Value *value, u...
function Value (line 1909) | Value *ParseContext::get_constant_mul(Value *value, uint32_t scale)
function VectorType (line 1959) | static VectorType *get_vec4_variant(Type *type)
function StructType (line 1972) | static StructType *get_sparse_feedback_variant(Type *type)
function Type (line 1980) | static Type *get_composite_return_type(Type *type)
function Instruction (line 1988) | Instruction *ParseContext::build_extract_composite(const ir::Op &op, V...
function Instruction (line 2852) | Instruction *ParseContext::build_descriptor_load(ir::SsaDef resource, ...
function MDOperand (line 2901) | MDOperand *ParseContext::create_null_meta()
function MDNode (line 2906) | MDNode *ParseContext::create_md_node(Vector<MDOperand *> ops)
function MDNode (line 2921) | MDNode *ParseContext::create_stage_io_meta()
function MDOperand (line 3073) | MDOperand *ParseContext::create_entry_point_meta(Function *patch_contr...
function Value (line 3924) | Value *ParseContext::get_value(const ir::Operand &op) const
function Value (line 3929) | Value *ParseContext::get_value(const ir::SsaDef &op) const
function BasicBlock (line 3935) | BasicBlock *ParseContext::get_basic_block(ir::SsaDef ssa)
function ConstantInt (line 3943) | ConstantInt *ParseContext::get_constant_uint(uint32_t value)
function ConstantAsMetadata (line 3948) | ConstantAsMetadata *ParseContext::create_constant_uint_meta(uint32_t v...
function ConstantAsMetadata (line 3953) | ConstantAsMetadata *ParseContext::create_constant_uint64_meta(uint32_t...
function ConstantAsMetadata (line 3958) | ConstantAsMetadata *ParseContext::create_constant_meta(Constant *c)
function MDString (line 3963) | MDString *ParseContext::create_string_meta(const String &str)
function Module (line 3969) | Module *parseDXBCIR(LLVMContext &context, ir::Builder &builder)
function Module (line 3982) | Module *parseDXBCBinary(LLVMContext &context, const void* data, size_t...
FILE: bc/type.cpp
type LLVMBC (line 30) | namespace LLVMBC
function PointerType (line 39) | PointerType *PointerType::get(Type *pointee, unsigned addr_space)
function Type (line 63) | Type *PointerType::getElementType() const
function ArrayType (line 75) | ArrayType *ArrayType::get(Type *element, uint64_t size)
function Type (line 106) | Type *VectorType::getElementType() const
function VectorType (line 111) | VectorType *VectorType::get(unsigned vector_size, Type *element)
function Type (line 148) | Type *Type::getArrayElementType() const
function Type (line 154) | Type *Type::getStructElementType(unsigned index) const
function Type (line 172) | Type *Type::getPointerElementType() const
function Type (line 189) | Type *StructType::getElementType(unsigned N) const
function StructType (line 195) | StructType *StructType::get(LLVMContext &context, Vector<Type *> membe...
function Type (line 239) | Type *FunctionType::getParamType(unsigned index) const
function Type (line 245) | Type *FunctionType::getReturnType() const
function Type (line 272) | Type *Type::getIntTy(LLVMContext &context, uint32_t width)
function Type (line 284) | Type *Type::getTy(LLVMContext &context, TypeID id)
function Type (line 296) | Type *Type::getVoidTy(LLVMContext &context)
function Type (line 301) | Type *Type::getHalfTy(LLVMContext &context)
function Type (line 306) | Type *Type::getFloatTy(LLVMContext &context)
function Type (line 311) | Type *Type::getDoubleTy(LLVMContext &context)
function Type (line 316) | Type *Type::getLabelTy(LLVMContext &context)
function Type (line 321) | Type *Type::getOpaqueTy(LLVMBC::LLVMContext &context)
function Type (line 326) | Type *Type::getMetadataTy(LLVMContext &context)
function Type (line 331) | Type *Type::getInt1Ty(LLVMContext &context)
function Type (line 336) | Type *Type::getInt8Ty(LLVMContext &context)
function Type (line 341) | Type *Type::getInt16Ty(LLVMContext &context)
function Type (line 346) | Type *Type::getInt32Ty(LLVMContext &context)
function Type (line 351) | Type *Type::getInt64Ty(LLVMContext &context)
function LLVMContext (line 366) | LLVMContext &Type::getContext()
FILE: bc/type.hpp
type LLVMBC (line 30) | namespace LLVMBC
class LLVMContext (line 32) | class LLVMContext
class Type (line 34) | class Type
type TypeID (line 37) | enum class TypeID
class PointerType (line 93) | class PointerType : public Type
method TypeID (line 96) | static constexpr TypeID get_type_id()
class ArrayType (line 109) | class ArrayType : public Type
method TypeID (line 112) | static constexpr TypeID get_type_id()
class IntegerType (line 125) | class IntegerType : public Type
method TypeID (line 128) | static constexpr TypeID get_type_id()
class StructType (line 139) | class StructType : public Type
method TypeID (line 142) | static constexpr TypeID get_type_id()
class VectorType (line 156) | class VectorType : public Type
method TypeID (line 159) | static constexpr TypeID get_type_id()
class FunctionType (line 174) | class FunctionType : public Type
method TypeID (line 177) | static constexpr TypeID get_type_id()
FILE: bc/value.cpp
type LLVMBC (line 33) | namespace LLVMBC
function Type (line 51) | Type *Value::getType() const
function ValueKind (line 56) | ValueKind Value::get_value_kind() const
function ConstantInt (line 98) | ConstantInt *ConstantInt::get(Type *type, uint64_t value)
function APInt (line 104) | const APInt &Constant::getUniqueInteger() const
function ConstantFP (line 156) | ConstantFP *ConstantFP::get(Type *type, uint64_t value)
function APFloat (line 174) | const APFloat &Constant::getValueAPF() const
function APInt (line 205) | APInt APFloat::bitcastToAPInt() const
function UndefValue (line 260) | UndefValue *UndefValue::get(Type *type)
function Constant (line 287) | Constant *ConstantDataArray::getElementAsConstant(unsigned index) const
function Constant (line 303) | Constant *ConstantDataVector::getElementAsConstant(unsigned index) const
function Constant (line 319) | Constant *ConstantAggregate::getOperand(unsigned index) const
function Constant (line 336) | Constant *ConstantExpr::getOperand(unsigned int N) const
function Constant (line 363) | Constant *GlobalVariable::getInitializer() const
FILE: bc/value.hpp
class Type (line 32) | class Type
type ValueKind (line 34) | enum class ValueKind
class Value (line 84) | class Value
class Argument (line 100) | class Argument : public Value
method ValueKind (line 106) | static constexpr ValueKind get_value_kind()
class APInt (line 117) | class APInt
method APInt (line 120) | APInt() = default;
class APFloat (line 135) | class APFloat
method APFloat (line 138) | APFloat() = default;
class Constant (line 151) | class Constant : public Value
method ValueKind (line 154) | static constexpr ValueKind get_value_kind()
function ValueKind (line 175) | static constexpr ValueKind get_value_kind()
function ValueKind (line 188) | static constexpr ValueKind get_value_kind()
function ValueKind (line 201) | static constexpr ValueKind get_value_kind()
function ValueKind (line 213) | static constexpr ValueKind get_value_kind()
class ConstantDataArray (line 223) | class ConstantDataArray : public Constant
method ValueKind (line 226) | static constexpr ValueKind get_value_kind()
class ConstantDataVector (line 241) | class ConstantDataVector : public Constant
method ValueKind (line 244) | static constexpr ValueKind get_value_kind()
class ConstantAggregate (line 259) | class ConstantAggregate : public Constant
method ValueKind (line 262) | static constexpr ValueKind get_value_kind()
class ConstantExpr (line 277) | class ConstantExpr : public Constant
method ValueKind (line 280) | static constexpr ValueKind get_value_kind()
class UndefValue (line 297) | class UndefValue : public Constant
method ValueKind (line 300) | static constexpr ValueKind get_value_kind()
class GlobalVariable (line 310) | class GlobalVariable : public Constant
method ValueKind (line 313) | static constexpr ValueKind get_value_kind()
type LinkageTypes (line 318) | enum LinkageTypes
FILE: cfg_structurizer.cpp
type dxil_spv (line 34) | namespace dxil_spv
function validate_phi (line 185) | static void validate_phi(const PHI &phi)
function validate_phi (line 198) | static void validate_phi(const Vector<PHI> &phis)
function scrub_rov_begin_lock (line 454) | static void scrub_rov_begin_lock(CFGNode *node, bool preserve_first_be...
function scrub_rov_end_lock (line 470) | static void scrub_rov_end_lock(CFGNode *node, bool preserve_last_end)
function scrub_rov_lock_regions (line 493) | static void scrub_rov_lock_regions(CFGNode *node, bool preserve_first_...
type Kind (line 688) | enum class Kind { None, Load, Store, Atomic }
type Block (line 690) | struct Block
type RewriteState (line 930) | struct RewriteState
function CFGNode (line 1453) | CFGNode *CFGStructurizer::get_entry_block() const
function block_is_control_dependent (line 1458) | static bool block_is_control_dependent(const CFGNode *node)
function get_remapped_id_for_duplicated_block (line 1595) | static spv::Id get_remapped_id_for_duplicated_block(spv::Id id, const ...
function Operation (line 1604) | Operation *CFGStructurizer::duplicate_op(Operation *op, UnorderedMap<s...
function rewrite_consumed_ids (line 1963) | static void rewrite_consumed_ids(IRBlock &ir, spv::Id from, spv::Id to)
function type_class_is_opaque (line 2004) | static bool type_class_is_opaque(spv::Op type_op)
type Origin (line 2012) | struct Origin
type Rewrite (line 2133) | struct Rewrite
function IncomingValue (line 2280) | static IncomingValue *phi_incoming_blocks_find_block(Vector<IncomingVa...
function id_is_generated_by_block (line 2288) | static bool id_is_generated_by_block(const CFGNode *block, spv::Id id)
function retarget_phi_incoming_block (line 2301) | static void retarget_phi_incoming_block(PHI &phi, CFGNode *from, CFGNo...
type LoopBacktracer (line 2827) | struct LoopBacktracer
type LoopMergeTracer (line 2833) | struct LoopMergeTracer
method LoopMergeTracer (line 2835) | explicit LoopMergeTracer(const LoopBacktracer &backtracer_)
function CFGNode (line 3325) | const CFGNode *CFGStructurizer::scan_plain_continue_block(const CFGNod...
function CFGNode (line 4680) | CFGNode *CFGStructurizer::find_natural_switch_merge_block(CFGNode *nod...
function CFGNode (line 4817) | CFGNode *CFGStructurizer::create_switch_merge_ladder(CFGNode *header, ...
function Operation (line 4825) | Operation *CFGStructurizer::build_switch_case_equal_check(
function CFGNode (line 5437) | const CFGNode *CFGStructurizer::get_innermost_loop_header_for(const CF...
function CFGNode (line 5461) | const CFGNode *CFGStructurizer::get_innermost_loop_header_for(const CF...
function CFGNode (line 5546) | CFGNode *CFGStructurizer::create_helper_pred_block(CFGNode *node)
function CFGNode (line 5631) | CFGNode *CFGStructurizer::create_helper_succ_block(CFGNode *node)
function CFGNode (line 5660) | CFGNode *CFGStructurizer::find_common_post_dominator(const Vector<CFGN...
function CFGNode (line 5673) | CFGNode *CFGStructurizer::find_break_target_for_selection_construct(CF...
function CFGNode (line 5726) | CFGNode *CFGStructurizer::find_common_post_dominator_with_ignored_brea...
function CFGNode (line 5794) | CFGNode *CFGStructurizer::transpose_code_path_through_ladder_block(
function CFGNode (line 6993) | CFGNode *CFGStructurizer::get_target_break_block_for_inner_header(cons...
function CFGNode (line 7032) | CFGNode *CFGStructurizer::create_ladder_block(CFGNode *header, CFGNode...
function CFGNode (line 7050) | CFGNode *CFGStructurizer::get_or_create_ladder_block(CFGNode *node, si...
function CFGNode (line 7071) | CFGNode *CFGStructurizer::build_enclosing_break_target_for_loop_ladder...
function CFGNode (line 7178) | CFGNode *CFGStructurizer::build_ladder_block_for_escaping_edge_handlin...
function CFGNode (line 7617) | CFGNode *CFGStructurizer::get_post_dominance_frontier_with_cfg_subset_...
FILE: cfg_structurizer.hpp
type dxil_spv (line 33) | namespace dxil_spv
class BlockEmissionInterface (line 35) | class BlockEmissionInterface
class SPIRVModule (line 36) | class SPIRVModule
type CFGNode (line 37) | struct CFGNode
class CFGNodePool (line 38) | class CFGNodePool
class BlockEmissionInterface (line 40) | class BlockEmissionInterface
class CFGStructurizer (line 48) | class CFGStructurizer
type LoopAnalysis (line 92) | struct LoopAnalysis
type LoopMergeAnalysis (line 103) | struct LoopMergeAnalysis
type SwitchProgressMode (line 141) | enum class SwitchProgressMode { Done, SimpleModify, IterativeModify }
type LoopExitType (line 191) | enum class LoopExitType
type PHINode (line 225) | struct PHINode
FILE: copy_reference_shaders.py
function hashstr (line 32) | def hashstr(path):
function add_tags (line 46) | def add_tags(path, noglsl):
function copy_reference_shader (line 52) | def copy_reference_shader(output_dir, input_path, raw, noglsl):
function main (line 61) | def main():
FILE: debug/logging.cpp
type dxil_spv (line 27) | namespace dxil_spv
function set_thread_log_callback (line 32) | void set_thread_log_callback(LoggingCallback callback, void *userdata)
function LoggingCallback (line 38) | LoggingCallback get_thread_log_callback()
FILE: debug/logging.hpp
type dxil_spv (line 90) | namespace dxil_spv
type LogLevel (line 92) | enum class LogLevel : uint32_t
FILE: descriptor_qa.cpp
type dxil_spv (line 30) | namespace dxil_spv
function build_descriptor_qa_heap_buffer_type (line 32) | static spv::Id build_descriptor_qa_heap_buffer_type(spv::Builder &buil...
function build_descriptor_global_buffer_type (line 64) | static spv::Id build_descriptor_global_buffer_type(spv::Builder &builder)
function build_ssbo_load (line 121) | static spv::Id build_ssbo_load(spv::Builder &builder, spv::Id value_ty...
function build_ssbo_store (line 137) | static void build_ssbo_store(spv::Builder &builder, spv::Id value_type...
function build_ssbo_load_array (line 154) | static spv::Id build_ssbo_load_array(spv::Builder &builder, spv::Id va...
function build_cookie_descriptor_info_split (line 172) | static void build_cookie_descriptor_info_split(spv::Builder &builder, ...
function build_live_check (line 208) | static spv::Id build_live_check(spv::Builder &builder, spv::Id status_...
function build_binary_op (line 231) | static spv::Id build_binary_op(spv::Builder &builder, spv::Id type, sp...
function build_ssbo_barrier (line 241) | static void build_ssbo_barrier(spv::Builder &builder)
function build_descriptor_qa_fault_report (line 250) | static void build_descriptor_qa_fault_report(SPIRVModule &module, spv:...
function build_descriptor_qa_check_function (line 353) | spv::Id build_descriptor_qa_check_function(SPIRVModule &module)
FILE: descriptor_qa.hpp
type dxil_spv (line 30) | namespace dxil_spv
type DescriptorQAInfo (line 34) | struct DescriptorQAInfo
type InstructionInstrumentationType (line 44) | enum class InstructionInstrumentationType
type InstructionInstrumentationInfo (line 59) | struct InstructionInstrumentationInfo
type InstructionInstrumentationState (line 74) | struct InstructionInstrumentationState
type DescriptorQATypeFlagBits (line 87) | enum DescriptorQATypeFlagBits
type DescriptorQAGlobalMembers (line 102) | enum class DescriptorQAGlobalMembers
type DescriptorQAFaultTypeBits (line 117) | enum DescriptorQAFaultTypeBits
type DescriptorQAHeapMembers (line 125) | enum class DescriptorQAHeapMembers
class SPIRVModule (line 132) | class SPIRVModule
FILE: dxbc_spirv_sandbox.cpp
type Remapper (line 21) | struct Remapper : ResourceRemappingInterface
method remap_srv (line 23) | bool remap_srv(const D3DBinding &d3d_binding, VulkanSRVBinding &vulkan...
method remap_sampler (line 33) | bool remap_sampler(const D3DBinding &d3d_binding, VulkanBinding &vulka...
method remap_uav (line 41) | bool remap_uav(const D3DUAVBinding &d3d_binding, VulkanUAVBinding &vul...
method remap_cbv (line 61) | bool remap_cbv(const D3DBinding &d3d_binding, VulkanCBVBinding &vulkan...
method remap_vertex_input (line 69) | bool remap_vertex_input(const D3DStageIO &d3d_input, VulkanStageIO &vu...
method remap_stream_output (line 76) | bool remap_stream_output(const D3DStreamOutput &, VulkanStreamOutput &...
method remap_stage_input (line 82) | bool remap_stage_input(const D3DStageIO &d3d_input, VulkanStageIO &vk_...
method remap_stage_output (line 87) | bool remap_stage_output(const D3DStageIO &d3d_output, VulkanStageIO &v...
method get_root_constant_word_count (line 92) | unsigned get_root_constant_word_count() override
method get_root_descriptor_count (line 97) | unsigned get_root_descriptor_count() override
method has_nontrivial_stage_input_remapping (line 102) | bool has_nontrivial_stage_input_remapping() override
function convert_to_asm (line 108) | static std::string convert_to_asm(const void *code, size_t size)
function validate_spirv (line 125) | static bool validate_spirv(const void *code, size_t size)
function convert_to_glsl (line 150) | static std::string convert_to_glsl(const void *code, size_t size)
function run_test (line 185) | static Vector<uint32_t> run_test(const char *name, ir::Builder &builder)
function main (line 268) | int main(int argc, char **argv)
FILE: dxil-disasm.py
function disasm_shader_regex (line 35) | def disasm_shader_regex(input_file, args, regex):
function disasm_shader_plain (line 74) | def disasm_shader_plain(input_file, args, regex):
function main (line 92) | def main():
FILE: dxil.hpp
type DXIL (line 31) | namespace DXIL
type ContainerHeader (line 35) | struct ContainerHeader
type PartHeader (line 45) | struct PartHeader
type ProgramHeader (line 51) | struct ProgramHeader
type IOElement (line 61) | struct IOElement
function fourcc (line 73) | constexpr uint32_t fourcc(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
type FourCC (line 78) | enum class FourCC : uint32_t
type RuntimeDataPartType (line 99) | enum class RuntimeDataPartType : uint32_t
type SubobjectKind (line 110) | enum class SubobjectKind : uint32_t
type HitGroupType (line 122) | enum class HitGroupType : uint32_t
type ComponentType (line 128) | enum class ComponentType : uint8_t
type InterpolationMode (line 150) | enum class InterpolationMode : uint8_t
type Semantic (line 163) | enum class Semantic : uint8_t
type ResourceType (line 201) | enum class ResourceType : uint8_t
type ResourceKind (line 209) | enum class ResourceKind : uint8_t
type Op (line 232) | enum class Op : unsigned
type AtomicBinOp (line 522) | enum class AtomicBinOp : uint8_t
type ShaderPropertyTag (line 543) | enum class ShaderPropertyTag : uint8_t
type GSStageOutTags (line 570) | enum class GSStageOutTags : uint32_t
type BarrierModeBits (line 576) | enum BarrierModeBits : uint8_t
type AddressSpace (line 584) | enum class AddressSpace : uint8_t
type InputPrimitive (line 592) | enum class InputPrimitive : uint8_t
type PrimitiveTopology (line 602) | enum class PrimitiveTopology : uint8_t
type TessellatorDomain (line 612) | enum class TessellatorDomain : uint8_t
type TessellatorOutputPrimitive (line 620) | enum class TessellatorOutputPrimitive : uint8_t
type TessellatorPartitioning (line 629) | enum class TessellatorPartitioning : uint8_t
type MeshOutputTopology (line 638) | enum class MeshOutputTopology
type ShaderFlag (line 645) | enum ShaderFlag
type WaveOpKind (line 651) | enum class WaveOpKind : uint8_t
type WaveBitOpKind (line 659) | enum class WaveBitOpKind : uint8_t
type WaveMultiPrefixOpKind (line 666) | enum class WaveMultiPrefixOpKind : uint8_t
type SignedOpKind (line 675) | enum class SignedOpKind : uint8_t
type ShaderKind (line 681) | enum class ShaderKind
type NodeLaunchType (line 702) | enum class NodeLaunchType
type NodeMetadataTag (line 710) | enum class NodeMetadataTag
type NodeIOFlagBits (line 721) | enum NodeIOFlagBits
type NodeIOKind (line 739) | enum class NodeIOKind
type MemoryTypeFlagBits (line 761) | enum MemoryTypeFlagBits
type BarrierSemanticsFlagBits (line 770) | enum BarrierSemanticsFlagBits
FILE: dxil_converter.cpp
type dxil_spv (line 41) | namespace dxil_spv
function ConvertedFunction (line 162) | ConvertedFunction Converter::convert_entry_point()
function T (line 168) | static T get_constant_metadata(const llvm::MDNode *node, unsigned index)
function String (line 174) | static String get_string_metadata(const llvm::MDNode *node, unsigned i...
function String (line 185) | static String get_resource_name_metadata(const llvm::MDNode *node, con...
function image_dimension_from_resource_kind (line 206) | static spv::Dim image_dimension_from_resource_kind(DXIL::ResourceKind ...
function image_dimension_is_arrayed (line 236) | static bool image_dimension_is_arrayed(DXIL::ResourceKind kind)
function image_dimension_is_multisampled (line 252) | static bool image_dimension_is_multisampled(DXIL::ResourceKind kind)
function convert_16bit_component_to_32bit (line 265) | static DXIL::ComponentType convert_16bit_component_to_32bit(DXIL::Comp...
function convert_component_to_unsigned (line 280) | static DXIL::ComponentType convert_component_to_unsigned(DXIL::Compone...
function normalize_component_type (line 295) | static DXIL::ComponentType normalize_component_type(DXIL::ComponentTyp...
function build_ssbo_runtime_array_type (line 316) | static spv::Id build_ssbo_runtime_array_type(Converter::Impl &impl, Ra...
function component_type_is_16bit (line 1037) | static bool component_type_is_16bit(DXIL::ComponentType type)
function execution_model_is_ray_tracing (line 2987) | static bool execution_model_is_ray_tracing(spv::ExecutionModel model)
function local_root_signature_matches (line 3087) | static bool local_root_signature_matches(const LocalRootSignatureEntry...
function ShaderStage (line 3778) | ShaderStage Converter::Impl::get_remapping_stage(spv::ExecutionModel e...
function half_to_float (line 3815) | static inline float half_to_float(uint16_t u16_value)
function String (line 4136) | static String get_entry_point_name(llvm::MDNode *node)
function get_execution_model_lib_target (line 4180) | static bool get_execution_model_lib_target(const llvm::Module &module,...
function get_execution_model (line 4187) | static spv::ExecutionModel get_execution_model(const llvm::Module &mod...
function module_is_ident (line 4548) | static bool module_is_ident(llvm::Module &module, const char *ident)
function module_is_dxilconv (line 4560) | static bool module_is_dxilconv(llvm::Module &module)
function module_is_dxbc_spirv (line 4565) | static bool module_is_dxbc_spirv(llvm::Module &module)
function get_geometry_shader_stream_index (line 4760) | static unsigned get_geometry_shader_stream_index(const llvm::MDNode *n...
function build_geometry_stream_row_offsets (line 4778) | static void build_geometry_stream_row_offsets(unsigned offsets[4], con...
function execution_model_has_incoming_payload (line 5364) | static bool execution_model_has_incoming_payload(spv::ExecutionModel m...
function execution_model_has_hit_attribute (line 5369) | static bool execution_model_has_hit_attribute(spv::ExecutionModel model)
function adjust_system_value (line 5565) | static void adjust_system_value(DXIL::Semantic &semantic, DXIL::Interp...
function instruction_has_side_effects (line 6294) | static bool instruction_has_side_effects(const llvm::Instruction &inst...
function NodeDispatchGrid (line 6390) | NodeDispatchGrid Converter::Impl::node_parse_dispatch_grid(llvm::MDNod...
function NodeOutputData (line 6583) | NodeOutputData Converter::Impl::get_node_output(llvm::MDNode *output)
function NodeInputData (line 6608) | NodeInputData Converter::Impl::get_node_input(llvm::MDNode *meta)
function NodeInputData (line 6739) | NodeInputData Converter::get_node_input(const LLVMBCParser &parser, co...
function String (line 6777) | String Converter::get_analysis_warnings() const
function entry_point_modifies_sample_mask (line 6878) | static bool entry_point_modifies_sample_mask(const llvm::MDNode *node)
function get_shader_flags (line 6906) | static uint64_t get_shader_flags(const llvm::MDNode *entry_point_meta)
function CFGNode (line 7862) | CFGNode *Converter::Impl::build_hull_passthrough_function(CFGNodePool ...
function CFGNode (line 8269) | CFGNode *Converter::Impl::convert_function(const Vector<llvm::BasicBlo...
function instruction_is_precise_sensitive (line 8545) | static bool instruction_is_precise_sensitive(const llvm::Instruction *...
function instruction_requires_no_contraction (line 8575) | static bool instruction_requires_no_contraction(const llvm::Instructio...
function mark_precise (line 8590) | static void mark_precise(UnorderedSet<const llvm::Instruction *> &cach...
function propagate_precise (line 8607) | static void propagate_precise(UnorderedSet<const llvm::Instruction *> ...
function propagate_precise (line 8625) | static void propagate_precise(llvm::Function *func)
function ConvertedFunction (line 8789) | ConvertedFunction Converter::Impl::convert_entry_point()
function Operation (line 8961) | Operation *Converter::Impl::allocate(spv::Op op)
function Operation (line 8966) | Operation *Converter::Impl::allocate(spv::Op op, spv::Id id, spv::Id t...
function Operation (line 8973) | Operation *Converter::Impl::allocate(spv::Op op, spv::Id type_id)
function Operation (line 8979) | Operation *Converter::Impl::allocate(spv::Op op, const llvm::Value *va...
function Operation (line 8986) | Operation *Converter::Impl::allocate(spv::Op op, const llvm::Value *va...
function ShaderStage (line 9643) | ShaderStage Converter::get_shader_stage(const LLVMBCParser &bitcode_pa...
function String (line 9684) | const String &Converter::get_compiled_entry_point() const
function GlobalConfiguration (line 9689) | const GlobalConfiguration &GlobalConfiguration::get()
FILE: dxil_converter.hpp
type spv (line 34) | namespace spv
class Function (line 36) | class Function
type ConvertedFunction (line 41) | struct ConvertedFunction
type Function (line 43) | struct Function
type ShaderStage (line 54) | enum class ShaderStage : unsigned
type D3DBinding (line 73) | struct D3DBinding
type VulkanDescriptorType (line 96) | enum class VulkanDescriptorType : unsigned
type VulkanBinding (line 106) | struct VulkanBinding
type D3DUAVBinding (line 132) | struct D3DUAVBinding
type VulkanSRVBinding (line 138) | struct VulkanSRVBinding
type VulkanUAVBinding (line 144) | struct VulkanUAVBinding
type VulkanPushConstantBinding (line 151) | struct VulkanPushConstantBinding
type VulkanCBVBinding (line 156) | struct VulkanCBVBinding
type D3DStageIO (line 168) | struct D3DStageIO
type VulkanStageIoFlagBits (line 176) | enum VulkanStageIoFlagBits
type VulkanStageIO (line 184) | struct VulkanStageIO
type D3DStreamOutput (line 191) | struct D3DStreamOutput
type VulkanStreamOutput (line 197) | struct VulkanStreamOutput
class ResourceRemappingInterface (line 205) | class ResourceRemappingInterface
type Option (line 222) | enum class Option : uint32_t
type ResourceClass (line 279) | enum class ResourceClass : uint32_t
type OptionBase (line 287) | struct OptionBase
method OptionBase (line 289) | explicit OptionBase(Option cap)
type OptionShaderDemoteToHelper (line 298) | struct OptionShaderDemoteToHelper : OptionBase
method OptionShaderDemoteToHelper (line 300) | OptionShaderDemoteToHelper()
type OptionDualSourceBlending (line 307) | struct OptionDualSourceBlending : OptionBase
method OptionDualSourceBlending (line 309) | OptionDualSourceBlending()
type OptionOutputSwizzle (line 316) | struct OptionOutputSwizzle : OptionBase
method OptionOutputSwizzle (line 318) | OptionOutputSwizzle()
type OptionRasterizerSampleCount (line 326) | struct OptionRasterizerSampleCount : OptionBase
method OptionRasterizerSampleCount (line 328) | OptionRasterizerSampleCount()
type OptionRootConstantInlineUniformBlock (line 336) | struct OptionRootConstantInlineUniformBlock : OptionBase
method OptionRootConstantInlineUniformBlock (line 338) | OptionRootConstantInlineUniformBlock()
type OptionBindlessCBVSSBOEmulation (line 347) | struct OptionBindlessCBVSSBOEmulation : OptionBase
method OptionBindlessCBVSSBOEmulation (line 349) | OptionBindlessCBVSSBOEmulation()
type OptionPhysicalStorageBuffer (line 356) | struct OptionPhysicalStorageBuffer : OptionBase
method OptionPhysicalStorageBuffer (line 358) | OptionPhysicalStorageBuffer()
type OptionSBTDescriptorSizeLog2 (line 365) | struct OptionSBTDescriptorSizeLog2 : OptionBase
method OptionSBTDescriptorSizeLog2 (line 367) | OptionSBTDescriptorSizeLog2()
type OptionSSBOAlignment (line 375) | struct OptionSSBOAlignment : OptionBase
method OptionSSBOAlignment (line 377) | OptionSSBOAlignment()
type OptionTypedUAVReadWithoutFormat (line 384) | struct OptionTypedUAVReadWithoutFormat : OptionBase
method OptionTypedUAVReadWithoutFormat (line 386) | OptionTypedUAVReadWithoutFormat()
type OptionShaderSourceFile (line 393) | struct OptionShaderSourceFile : OptionBase
method OptionShaderSourceFile (line 395) | OptionShaderSourceFile()
type OptionBindlessTypedBufferOffsets (line 402) | struct OptionBindlessTypedBufferOffsets : OptionBase
method OptionBindlessTypedBufferOffsets (line 404) | OptionBindlessTypedBufferOffsets()
type OptionBindlessOffsetBufferLayout (line 411) | struct OptionBindlessOffsetBufferLayout : OptionBase
method OptionBindlessOffsetBufferLayout (line 413) | OptionBindlessOffsetBufferLayout()
type OptionStorageInputOutput16 (line 423) | struct OptionStorageInputOutput16 : OptionBase
method OptionStorageInputOutput16 (line 425) | OptionStorageInputOutput16()
type OptionDescriptorQA (line 433) | struct OptionDescriptorQA : OptionBase
method OptionDescriptorQA (line 435) | OptionDescriptorQA()
type OptionMinPrecisionNative16Bit (line 451) | struct OptionMinPrecisionNative16Bit : OptionBase
method OptionMinPrecisionNative16Bit (line 453) | OptionMinPrecisionNative16Bit()
type OptionShaderI8Dot (line 461) | struct OptionShaderI8Dot : OptionBase
method OptionShaderI8Dot (line 463) | OptionShaderI8Dot()
type OptionShaderRayTracingPrimitiveCulling (line 471) | struct OptionShaderRayTracingPrimitiveCulling : OptionBase
method OptionShaderRayTracingPrimitiveCulling (line 473) | OptionShaderRayTracingPrimitiveCulling()
type OptionInvariantPosition (line 481) | struct OptionInvariantPosition : OptionBase
method OptionInvariantPosition (line 483) | OptionInvariantPosition()
type OptionScalarBlockLayout (line 491) | struct OptionScalarBlockLayout : OptionBase
method OptionScalarBlockLayout (line 493) | OptionScalarBlockLayout()
type OptionBarycentricKHR (line 502) | struct OptionBarycentricKHR : OptionBase
method OptionBarycentricKHR (line 504) | OptionBarycentricKHR()
type OptionRobustPhysicalCBVLoad (line 512) | struct OptionRobustPhysicalCBVLoad : OptionBase
method OptionRobustPhysicalCBVLoad (line 514) | OptionRobustPhysicalCBVLoad()
type OptionArithmeticRelaxedPrecision (line 522) | struct OptionArithmeticRelaxedPrecision : OptionBase
method OptionArithmeticRelaxedPrecision (line 524) | OptionArithmeticRelaxedPrecision()
type OptionPhysicalAddressDescriptorIndexing (line 532) | struct OptionPhysicalAddressDescriptorIndexing : OptionBase
method OptionPhysicalAddressDescriptorIndexing (line 534) | OptionPhysicalAddressDescriptorIndexing()
type OptionForceSubgroupSize (line 546) | struct OptionForceSubgroupSize : OptionBase
method OptionForceSubgroupSize (line 548) | OptionForceSubgroupSize()
type OptionDenormPreserveSupport (line 564) | struct OptionDenormPreserveSupport : OptionBase
method OptionDenormPreserveSupport (line 566) | OptionDenormPreserveSupport()
type OptionStrictHelperLaneWaveOps (line 577) | struct OptionStrictHelperLaneWaveOps : OptionBase
method OptionStrictHelperLaneWaveOps (line 579) | OptionStrictHelperLaneWaveOps()
type OptionSubgroupPartitionedNV (line 589) | struct OptionSubgroupPartitionedNV : OptionBase
method OptionSubgroupPartitionedNV (line 591) | OptionSubgroupPartitionedNV()
type OptionDeadCodeEliminate (line 599) | struct OptionDeadCodeEliminate : OptionBase
method OptionDeadCodeEliminate (line 601) | OptionDeadCodeEliminate()
type OptionPreciseControl (line 609) | struct OptionPreciseControl : OptionBase
method OptionPreciseControl (line 611) | OptionPreciseControl()
type OptionSampleGradOptimizationControl (line 620) | struct OptionSampleGradOptimizationControl : OptionBase
method OptionSampleGradOptimizationControl (line 622) | OptionSampleGradOptimizationControl()
type OptionOpacityMicromap (line 631) | struct OptionOpacityMicromap : OptionBase
method OptionOpacityMicromap (line 633) | OptionOpacityMicromap()
type OptionBranchControl (line 641) | struct OptionBranchControl : OptionBase
method OptionBranchControl (line 643) | OptionBranchControl()
type OptionSubgroupProperties (line 655) | struct OptionSubgroupProperties : OptionBase
method OptionSubgroupProperties (line 657) | OptionSubgroupProperties()
type OptionDescriptorHeapRobustness (line 666) | struct OptionDescriptorHeapRobustness : OptionBase
method OptionDescriptorHeapRobustness (line 668) | OptionDescriptorHeapRobustness()
type OptionComputeShaderDerivativesNV (line 676) | struct OptionComputeShaderDerivativesNV : OptionBase
method OptionComputeShaderDerivativesNV (line 678) | OptionComputeShaderDerivativesNV()
type OptionQuadControlReconvergence (line 687) | struct OptionQuadControlReconvergence : OptionBase
method OptionQuadControlReconvergence (line 689) | OptionQuadControlReconvergence()
type OptionRawAccessChainsNV (line 699) | struct OptionRawAccessChainsNV : OptionBase
method OptionRawAccessChainsNV (line 701) | OptionRawAccessChainsNV()
type OptionDriverVersion (line 709) | struct OptionDriverVersion : OptionBase
method OptionDriverVersion (line 711) | OptionDriverVersion()
type OptionComputeShaderDerivatives (line 720) | struct OptionComputeShaderDerivatives : OptionBase
method OptionComputeShaderDerivatives (line 722) | OptionComputeShaderDerivatives()
type OptionInstructionInstrumentation (line 731) | struct OptionInstructionInstrumentation : OptionBase
method OptionInstructionInstrumentation (line 733) | OptionInstructionInstrumentation()
type ShaderQuirk (line 750) | enum class ShaderQuirk : uint32_t
type OptionShaderQuirk (line 768) | struct OptionShaderQuirk : OptionBase
method OptionShaderQuirk (line 770) | OptionShaderQuirk()
type OptionExtendedRobustness (line 778) | struct OptionExtendedRobustness : OptionBase
method OptionExtendedRobustness (line 780) | OptionExtendedRobustness()
type OptionMaxTessFactor (line 790) | struct OptionMaxTessFactor : OptionBase
method OptionMaxTessFactor (line 792) | OptionMaxTessFactor()
type OptionVulkanMemoryModel (line 800) | struct OptionVulkanMemoryModel : OptionBase
method OptionVulkanMemoryModel (line 802) | OptionVulkanMemoryModel()
type OptionFloat8Support (line 810) | struct OptionFloat8Support : OptionBase
method OptionFloat8Support (line 812) | OptionFloat8Support()
type OptionNvAPI (line 821) | struct OptionNvAPI : OptionBase
method OptionNvAPI (line 823) | OptionNvAPI()
type OptionExtendedNonSemantic (line 833) | struct OptionExtendedNonSemantic : OptionBase
method OptionExtendedNonSemantic (line 835) | OptionExtendedNonSemantic()
type OptionViewInstancing (line 843) | struct OptionViewInstancing : OptionBase
method OptionViewInstancing (line 845) | OptionViewInstancing()
type OptionMixedDotProduct (line 857) | struct OptionMixedDotProduct : OptionBase
method OptionMixedDotProduct (line 859) | OptionMixedDotProduct()
type OptionComputeShaderDerivativesQuad (line 867) | struct OptionComputeShaderDerivativesQuad : OptionBase
method OptionComputeShaderDerivativesQuad (line 869) | OptionComputeShaderDerivativesQuad()
type DescriptorTableEntry (line 877) | struct DescriptorTableEntry
type NodeDispatchGrid (line 886) | struct NodeDispatchGrid
type NodeInputData (line 893) | struct NodeInputData
type NodeOutputData (line 917) | struct NodeOutputData
type NonSemanticDebugInfo (line 927) | struct NonSemanticDebugInfo
type ShaderFeature (line 934) | enum class ShaderFeature
type MetaDescriptor (line 940) | enum class MetaDescriptor
type MetaDescriptorKind (line 961) | enum class MetaDescriptorKind
class Converter (line 980) | class Converter
type Impl (line 1051) | struct Impl
FILE: dxil_extract.cpp
function print_help (line 34) | static void print_help()
function read_file (line 39) | static std::vector<uint8_t> read_file(const char *path)
function write_file (line 59) | static bool write_file(const char *path, const void *data, size_t size)
function vkd3d_proton_hash_fnv1 (line 76) | static uint64_t vkd3d_proton_hash_fnv1(const void *data_, size_t size)
function main (line 87) | int main(int argc, char **argv)
FILE: dxil_parser.cpp
type dxil_spv (line 33) | namespace dxil_spv
function is_mangled_entry_point (line 35) | bool is_mangled_entry_point(const char *user)
function String (line 51) | String demangle_entry_point(const String &entry)
FILE: dxil_parser.hpp
type dxil_spv (line 32) | namespace dxil_spv
class MemoryStream (line 34) | class MemoryStream
type RDATSubobject (line 36) | struct RDATSubobject
class DXILContainerParser (line 59) | class DXILContainerParser
method is_dxbc_binary (line 65) | bool is_dxbc_binary() const { return dxbc_binary; }
FILE: dxil_spirv.cpp
function convert_to_asm (line 43) | static std::string convert_to_asm(const void *code, size_t size)
function validate_spirv (line 57) | static bool validate_spirv(const void *code, size_t size)
function convert_to_glsl (line 81) | static std::string convert_to_glsl(const void *code, size_t size)
function read_file (line 118) | static std::vector<uint8_t> read_file(const char *path)
function print_help (line 138) | static void print_help()
type MetaDescriptor (line 208) | struct MetaDescriptor
type Arguments (line 216) | struct Arguments
type Remapper (line 297) | struct Remapper
type RootConstant (line 299) | struct RootConstant
type RootDescriptor (line 306) | struct RootDescriptor
type VertexInput (line 318) | struct VertexInput
type StreamOutput (line 325) | struct StreamOutput
function kind_is_buffer (line 346) | static bool kind_is_buffer(dxil_spv_resource_kind kind)
function find_root_descriptor_index (line 352) | static int32_t find_root_descriptor_index(const Remapper *remapper, cons...
function d3d_binding_is_global_heap (line 369) | static bool d3d_binding_is_global_heap(const dxil_spv_d3d_binding &binding)
function dxil_spv_bool (line 376) | static dxil_spv_bool remap_srv(void *userdata, const dxil_spv_d3d_bindin...
function dxil_spv_bool (line 444) | static dxil_spv_bool remap_sampler(void *userdata, const dxil_spv_d3d_bi...
function dxil_spv_bool (line 473) | static dxil_spv_bool remap_uav(void *userdata, const dxil_spv_uav_d3d_bi...
function dxil_spv_bool (line 549) | static dxil_spv_bool remap_cbv(void *userdata, const dxil_spv_d3d_bindin...
function dxil_spv_bool (line 602) | static dxil_spv_bool remap_vertex_input(void *userdata, const dxil_spv_d...
function dxil_spv_bool (line 626) | static dxil_spv_bool remap_stream_output(void *userdata, const dxil_spv_...
function main (line 652) | int main(int argc, char **argv)
FILE: dxil_spirv_c.cpp
function dxil_spv_get_version (line 39) | void dxil_spv_get_version(unsigned *major, unsigned *minor, unsigned *pa...
type dxil_spv_parsed_blob_s (line 46) | struct dxil_spv_parsed_blob_s
type EntryPoint (line 57) | struct EntryPoint
type Remapper (line 67) | struct Remapper : ResourceRemappingInterface
method copy_buffer_binding (line 69) | static void copy_buffer_binding(VulkanBinding &vk_binding, const dxil_...
method remap_srv (line 79) | bool remap_srv(const D3DBinding &binding, VulkanSRVBinding &vk_binding...
method remap_sampler (line 112) | bool remap_sampler(const D3DBinding &binding, VulkanBinding &vk_bindin...
method remap_uav (line 143) | bool remap_uav(const D3DUAVBinding &binding, VulkanUAVBinding &vk_bind...
method remap_cbv (line 181) | bool remap_cbv(const D3DBinding &binding, VulkanCBVBinding &vk_binding...
method remap_vertex_input (line 216) | bool remap_vertex_input(const D3DStageIO &d3d_input, VulkanStageIO &vk...
method remap_stream_output (line 240) | bool remap_stream_output(const D3DStreamOutput &d3d_output, VulkanStre...
method remap_stage_input (line 264) | bool remap_stage_input(const D3DStageIO &d3d_input, VulkanStageIO &vk_...
method has_nontrivial_stage_input_remapping (line 287) | bool has_nontrivial_stage_input_remapping() override
method remap_stage_output (line 292) | bool remap_stage_output(const D3DStageIO &d3d_output, VulkanStageIO &v...
method get_root_constant_word_count (line 315) | unsigned get_root_constant_word_count() override
method get_root_descriptor_count (line 320) | unsigned get_root_descriptor_count() override
type LocalRootParameterType (line 353) | enum class LocalRootParameterType
type LocalConstants (line 360) | struct LocalConstants
type LocalDescriptor (line 367) | struct LocalDescriptor
type LocalRootParameter (line 374) | struct LocalRootParameter
type dxil_spv_converter_s (line 382) | struct dxil_spv_converter_s
method dxil_spv_converter_s (line 384) | dxil_spv_converter_s(LLVMBCParser &bc_parser_, LLVMBCParser *bc_reflec...
type MetaDescriptorMapping (line 401) | struct MetaDescriptorMapping
function dxil_spv_result (line 427) | dxil_spv_result dxil_spv_parse_dxil_blob(const void *data, size_t size, ...
function dxil_spv_result (line 470) | dxil_spv_result dxil_spv_parse_reflection_dxil_blob(const void *data, si...
function dxil_spv_result (line 501) | dxil_spv_result dxil_spv_parse_dxil(const void *data, size_t size, dxil_...
function dxil_spv_parsed_blob_dump_llvm_ir (line 527) | void dxil_spv_parsed_blob_dump_llvm_ir(dxil_spv_parsed_blob blob)
function dxil_spv_result (line 541) | dxil_spv_result dxil_spv_parsed_blob_get_disassembled_ir(dxil_spv_parsed...
function dxil_spv_result (line 557) | dxil_spv_result dxil_spv_parsed_blob_get_raw_ir(dxil_spv_parsed_blob blo...
function dxil_spv_shader_stage (line 567) | dxil_spv_shader_stage dxil_spv_parsed_blob_get_shader_stage(dxil_spv_par...
function dxil_spv_shader_stage (line 572) | dxil_spv_shader_stage dxil_spv_parsed_blob_get_shader_stage_for_entry(dx...
function dxil_spv_result (line 577) | dxil_spv_result dxil_spv_parsed_blob_get_entry_index_by_name(dxil_spv_pa...
function dxil_spv_result (line 593) | dxil_spv_result dxil_spv_parsed_blob_get_num_entry_points(dxil_spv_parse...
function dxil_spv_result (line 599) | dxil_spv_result dxil_spv_parsed_blob_get_entry_point_name(dxil_spv_parse...
function dxil_spv_result (line 609) | dxil_spv_result dxil_spv_parsed_blob_get_entry_point_demangled_name(dxil...
function dxil_spv_result (line 619) | dxil_spv_result dxil_spv_parsed_blob_get_entry_point_node_input(
function dxil_spv_result (line 655) | dxil_spv_result dxil_spv_parsed_blob_get_entry_point_num_node_outputs(
function dxil_spv_result (line 665) | dxil_spv_result dxil_spv_parsed_blob_get_entry_point_node_output(
function dxil_spv_result (line 687) | dxil_spv_result dxil_spv_parsed_blob_scan_resources(dxil_spv_parsed_blob...
function dxil_spv_parsed_blob_free (line 707) | void dxil_spv_parsed_blob_free(dxil_spv_parsed_blob blob)
function dxil_spv_result (line 712) | dxil_spv_result dxil_spv_create_converter_with_reflection(dxil_spv_parse...
function dxil_spv_result (line 724) | dxil_spv_result dxil_spv_create_converter(dxil_spv_parsed_blob blob, dxi...
function dxil_spv_converter_free (line 729) | void dxil_spv_converter_free(dxil_spv_converter converter)
function dxil_spv_converter_set_entry_point (line 734) | void dxil_spv_converter_set_entry_point(dxil_spv_converter converter, co...
function dxil_spv_result (line 742) | dxil_spv_result dxil_spv_converter_run(dxil_spv_converter converter)
function dxil_spv_result (line 850) | dxil_spv_result dxil_spv_converter_get_compiled_spirv(dxil_spv_converter...
function dxil_spv_result (line 860) | dxil_spv_result dxil_spv_converter_get_compiled_entry_point(dxil_spv_con...
function dxil_spv_converter_set_srv_remapper (line 870) | void dxil_spv_converter_set_srv_remapper(dxil_spv_converter converter, d...
function dxil_spv_converter_set_sampler_remapper (line 877) | void dxil_spv_converter_set_sampler_remapper(dxil_spv_converter converte...
function dxil_spv_converter_set_root_constant_word_count (line 884) | void dxil_spv_converter_set_root_constant_word_count(dxil_spv_converter ...
function dxil_spv_converter_set_root_descriptor_count (line 889) | void dxil_spv_converter_set_root_descriptor_count(dxil_spv_converter con...
function dxil_spv_converter_set_uav_remapper (line 894) | void dxil_spv_converter_set_uav_remapper(dxil_spv_converter converter, d...
function dxil_spv_converter_set_cbv_remapper (line 901) | void dxil_spv_converter_set_cbv_remapper(dxil_spv_converter converter, d...
function dxil_spv_converter_set_stage_input_remapper (line 908) | void dxil_spv_converter_set_stage_input_remapper(dxil_spv_converter conv...
function dxil_spv_converter_set_stage_output_remapper (line 915) | void dxil_spv_converter_set_stage_output_remapper(dxil_spv_converter con...
function dxil_spv_converter_set_vertex_input_remapper (line 922) | void dxil_spv_converter_set_vertex_input_remapper(dxil_spv_converter con...
function dxil_spv_converter_set_stream_output_remapper (line 929) | void dxil_spv_converter_set_stream_output_remapper(dxil_spv_converter co...
function dxil_spv_bool (line 937) | dxil_spv_bool dxil_spv_converter_supports_option(dxil_spv_option cap)
function duplicate (line 943) | static std::unique_ptr<T> duplicate(const T &value)
function dxil_spv_result (line 948) | dxil_spv_result dxil_spv_converter_add_option(dxil_spv_converter convert...
function dxil_spv_converter_add_local_root_constants (line 1492) | void dxil_spv_converter_add_local_root_constants(dxil_spv_converter conv...
function dxil_spv_converter_add_local_root_descriptor (line 1503) | void dxil_spv_converter_add_local_root_descriptor(dxil_spv_converter con...
function dxil_spv_converter_add_local_root_descriptor_table (line 1514) | void dxil_spv_converter_add_local_root_descriptor_table(dxil_spv_convert...
function dxil_spv_result (line 1539) | dxil_spv_result dxil_spv_converter_begin_local_root_descriptor_table(
function dxil_spv_result (line 1550) | dxil_spv_result dxil_spv_converter_end_local_root_descriptor_table(
function dxil_spv_converter_add_root_parameter_mapping (line 1565) | void dxil_spv_converter_add_root_parameter_mapping(
function dxil_spv_converter_add_root_descriptor_mapping (line 1571) | void dxil_spv_converter_add_root_descriptor_mapping(
function dxil_spv_converter_add_non_semantic_debug_info (line 1580) | void dxil_spv_converter_add_non_semantic_debug_info(
function dxil_spv_converter_set_patch_location_offset (line 1586) | void dxil_spv_converter_set_patch_location_offset(
function dxil_spv_parsed_blob_get_num_rdat_subobjects (line 1592) | unsigned dxil_spv_parsed_blob_get_num_rdat_subobjects(dxil_spv_parsed_bl...
function dxil_spv_parsed_blob_get_rdat_subobject (line 1597) | void dxil_spv_parsed_blob_get_rdat_subobject(
function dxil_spv_bool (line 1612) | dxil_spv_bool dxil_spv_converter_uses_subgroup_size(dxil_spv_converter c...
function dxil_spv_result (line 1617) | dxil_spv_result dxil_spv_converter_get_compute_workgroup_dimensions(
function dxil_spv_result (line 1627) | dxil_spv_result dxil_spv_converter_get_compute_required_wave_size(
function dxil_spv_result (line 1638) | dxil_spv_result dxil_spv_converter_get_compute_wave_size_range(
function dxil_spv_result (line 1647) | dxil_spv_result dxil_spv_converter_get_compute_heuristic_max_wave_size(
function dxil_spv_result (line 1654) | dxil_spv_result dxil_spv_converter_get_compute_heuristic_min_wave_size(
function dxil_spv_result (line 1661) | dxil_spv_result dxil_spv_converter_get_patch_vertex_count(
function dxil_spv_result (line 1668) | dxil_spv_result dxil_spv_converter_get_patch_location_offset(
function dxil_spv_bool (line 1675) | dxil_spv_bool dxil_spv_converter_uses_shader_feature(
function dxil_spv_result (line 1684) | dxil_spv_result dxil_spv_converter_is_multiview_compatible(
function dxil_spv_result (line 1691) | dxil_spv_result dxil_spv_converter_set_meta_descriptor(
function dxil_spv_begin_thread_allocator_context (line 1706) | void dxil_spv_begin_thread_allocator_context(void)
function dxil_spv_end_thread_allocator_context (line 1711) | void dxil_spv_end_thread_allocator_context(void)
function dxil_spv_reset_thread_allocator_context (line 1716) | void dxil_spv_reset_thread_allocator_context(void)
function c_callback_wrapper_trampoline (line 1722) | static void c_callback_wrapper_trampoline(void *userdata, dxil_spv::LogL...
function dxil_spv_set_thread_log_callback (line 1728) | void dxil_spv_set_thread_log_callback(dxil_spv_log_cb callback, void *us...
FILE: dxil_spirv_c.h
type dxil_spv_bool (line 60) | typedef unsigned char dxil_spv_bool;
type dxil_spv_result (line 64) | typedef enum dxil_spv_result
type dxil_spv_shader_stage (line 77) | typedef enum dxil_spv_shader_stage
type dxil_spv_d3d_vertex_input (line 98) | typedef struct dxil_spv_d3d_vertex_input
type dxil_spv_vulkan_vertex_input (line 106) | typedef struct dxil_spv_vulkan_vertex_input
type dxil_spv_bool (line 110) | typedef dxil_spv_bool (*dxil_spv_vertex_input_remapper_cb)(void *userdat...
type dxil_spv_d3d_stream_output (line 113) | typedef struct dxil_spv_d3d_stream_output
type dxil_spv_vulkan_stream_output (line 119) | typedef struct dxil_spv_vulkan_stream_output
type dxil_spv_bool (line 127) | typedef dxil_spv_bool (*dxil_spv_stream_output_remapper_cb)(void *userda...
type dxil_spv_d3d_shader_stage_io (line 130) | typedef struct dxil_spv_d3d_shader_stage_io
type dxil_spv_vulkan_shader_stage_io_flags (line 138) | enum dxil_spv_vulkan_shader_stage_io_flags
type dxil_spv_vulkan_shader_stage_io (line 144) | typedef struct dxil_spv_vulkan_shader_stage_io
type dxil_spv_bool (line 151) | typedef dxil_spv_bool (*dxil_spv_shader_stage_io_remapper_cb)(void *user...
type dxil_spv_resource_kind (line 155) | typedef enum dxil_spv_resource_kind
type dxil_spv_resource_class (line 179) | typedef enum dxil_spv_resource_class
type dxil_spv_vulkan_descriptor_type (line 188) | typedef enum dxil_spv_vulkan_descriptor_type
type dxil_spv_rdat_subobject_kind (line 203) | typedef enum dxil_spv_rdat_subobject_kind
type dxil_spv_hit_group_type (line 216) | typedef enum dxil_spv_hit_group_type
type dxil_spv_shader_quirk (line 223) | typedef enum dxil_spv_shader_quirk
type dxil_spv_meta_descriptor (line 246) | typedef enum dxil_spv_meta_descriptor
type dxil_spv_meta_descriptor_kind (line 255) | typedef enum dxil_spv_meta_descriptor_kind
type dxil_spv_node_launch_type (line 267) | typedef enum dxil_spv_node_launch_type
type dxil_spv_d3d_binding (line 277) | typedef struct dxil_spv_d3d_binding
type dxil_spv_vulkan_binding (line 291) | typedef struct dxil_spv_vulkan_binding
type dxil_spv_uav_d3d_binding (line 317) | typedef struct dxil_spv_uav_d3d_binding
type dxil_spv_srv_vulkan_binding (line 323) | typedef struct dxil_spv_srv_vulkan_binding
type dxil_spv_uav_vulkan_binding (line 329) | typedef struct dxil_spv_uav_vulkan_binding
type dxil_spv_push_constant_mapping (line 336) | typedef struct dxil_spv_push_constant_mapping
type dxil_spv_cbv_vulkan_binding (line 341) | typedef struct dxil_spv_cbv_vulkan_binding
type dxil_spv_compiled_spirv (line 351) | typedef struct dxil_spv_compiled_spirv
type dxil_spv_bool (line 357) | typedef dxil_spv_bool (*dxil_spv_srv_remapper_cb)(void *userdata,
type dxil_spv_bool (line 360) | typedef dxil_spv_bool (*dxil_spv_sampler_remapper_cb)(void *userdata,
type dxil_spv_bool (line 363) | typedef dxil_spv_bool (*dxil_spv_uav_remapper_cb)(void *userdata,
type dxil_spv_bool (line 366) | typedef dxil_spv_bool (*dxil_spv_cbv_remapper_cb)(void *userdata,
type dxil_spv_rdat_subobject (line 370) | typedef struct dxil_spv_rdat_subobject
type dxil_spv_node_input_data (line 384) | typedef struct dxil_spv_node_input_data
type dxil_spv_node_output_data (line 410) | typedef struct dxil_spv_node_output_data
type dxil_spv_log_level (line 423) | typedef enum dxil_spv_log_level
type dxil_spv_option (line 433) | typedef enum dxil_spv_option
type dxil_spv_shader_feature (line 490) | typedef enum dxil_spv_shader_feature
type dxil_spv_instruction_instrumentation_type (line 496) | typedef enum dxil_spv_instruction_instrumentation_type
type dxil_spv_option_base (line 506) | typedef struct dxil_spv_option_base
type dxil_spv_option_shader_demote_to_helper (line 511) | typedef struct dxil_spv_option_shader_demote_to_helper
type dxil_spv_option_dual_source_blending (line 517) | typedef struct dxil_spv_option_dual_source_blending
type dxil_spv_option_output_swizzle (line 523) | typedef struct dxil_spv_option_output_swizzle
type dxil_spv_option_rasterizer_sample_count (line 538) | typedef struct dxil_spv_option_rasterizer_sample_count
type dxil_spv_option_root_constant_inline_uniform_block (line 545) | typedef struct dxil_spv_option_root_constant_inline_uniform_block
type dxil_spv_option_bindless_cbv_ssbo_emulation (line 553) | typedef struct dxil_spv_option_bindless_cbv_ssbo_emulation
type dxil_spv_option_physical_storage_buffer (line 559) | typedef struct dxil_spv_option_physical_storage_buffer
type dxil_spv_option_sbt_descriptor_size_log2 (line 565) | typedef struct dxil_spv_option_sbt_descriptor_size_log2
type dxil_spv_option_ssbo_alignment (line 572) | typedef struct dxil_spv_option_ssbo_alignment
type dxil_spv_option_typed_uav_read_without_format (line 578) | typedef struct dxil_spv_option_typed_uav_read_without_format
type dxil_spv_option_shader_source_file (line 584) | typedef struct dxil_spv_option_shader_source_file
type dxil_spv_option_bindless_typed_buffer_offsets (line 590) | typedef struct dxil_spv_option_bindless_typed_buffer_offsets
type dxil_spv_option_bindless_offset_buffer_layout (line 596) | typedef struct dxil_spv_option_bindless_offset_buffer_layout
type dxil_spv_option_storage_input_output_16bit (line 604) | typedef struct dxil_spv_option_storage_input_output_16bit
type dxil_spv_option_descriptor_qa (line 610) | typedef struct dxil_spv_option_descriptor_qa
type dxil_spv_option_min_precision_native_16bit (line 622) | typedef struct dxil_spv_option_min_precision_native_16bit
type dxil_spv_option_shader_i8_dot (line 628) | typedef struct dxil_spv_option_shader_i8_dot
type dxil_spv_option_shader_ray_tracing_primitive_culling (line 634) | typedef struct dxil_spv_option_shader_ray_tracing_primitive_culling
type dxil_spv_option_invariant_position (line 640) | typedef struct dxil_spv_option_invariant_position
type dxil_spv_option_scalar_block_layout (line 646) | typedef struct dxil_spv_option_scalar_block_layout
type dxil_spv_option_barycentric_khr (line 653) | typedef struct dxil_spv_option_barycentric_khr
type dxil_spv_option_robust_physical_cbv_load (line 660) | typedef struct dxil_spv_option_robust_physical_cbv_load
type dxil_spv_option_arithmetic_relaxed_precision (line 666) | typedef struct dxil_spv_option_arithmetic_relaxed_precision
type dxil_spv_option_physical_address_descriptor_indexing (line 672) | typedef struct dxil_spv_option_physical_address_descriptor_indexing
type dxil_spv_option_force_subgroup_size (line 679) | typedef struct dxil_spv_option_force_subgroup_size
type dxil_spv_option_denorm_preserve_support (line 686) | typedef struct dxil_spv_option_denorm_preserve_support
type dxil_spv_option_strict_helper_lane_wave_ops (line 693) | typedef struct dxil_spv_option_strict_helper_lane_wave_ops
type dxil_spv_option_subgroup_partitioned_nv (line 699) | typedef struct dxil_spv_option_subgroup_partitioned_nv
type dxil_spv_option_dead_code_eliminate (line 705) | typedef struct dxil_spv_option_dead_code_eliminate
type dxil_spv_option_precise_control (line 711) | typedef struct dxil_spv_option_precise_control
type dxil_spv_option_sample_grad_optimization_control (line 718) | typedef struct dxil_spv_option_sample_grad_optimization_control
type dxil_spv_option_opacity_micromap (line 725) | typedef struct dxil_spv_option_opacity_micromap
type dxil_spv_option_branch_control (line 731) | typedef struct dxil_spv_option_branch_control
type dxil_spv_option_subgroup_properties (line 741) | typedef struct dxil_spv_option_subgroup_properties
type dxil_spv_option_descriptor_heap_robustness (line 748) | typedef struct dxil_spv_option_descriptor_heap_robustness
type dxil_spv_option_compute_shader_derivatives_nv (line 754) | typedef struct dxil_spv_option_compute_shader_derivatives_nv
type dxil_spv_option_quad_control_reconvergence (line 760) | typedef struct dxil_spv_option_quad_control_reconvergence
type dxil_spv_option_raw_access_chains_nv (line 768) | typedef struct dxil_spv_option_raw_access_chains_nv
type dxil_spv_option_driver_version (line 774) | typedef struct dxil_spv_option_driver_version
type dxil_spv_option_compute_shader_derivatives (line 781) | typedef struct dxil_spv_option_compute_shader_derivatives
type dxil_spv_option_instruction_instrumentation (line 788) | typedef struct dxil_spv_option_instruction_instrumentation
type dxil_spv_option_shader_quirk (line 801) | typedef struct dxil_spv_option_shader_quirk
type dxil_spv_option_extended_robustness (line 807) | typedef struct dxil_spv_option_extended_robustness
type dxil_spv_option_max_tess_factor (line 815) | typedef struct dxil_spv_option_max_tess_factor
type dxil_spv_option_vulkan_memory_model (line 821) | typedef struct dxil_spv_option_vulkan_memory_model
type dxil_spv_option_float8_support (line 827) | typedef struct dxil_spv_option_float8_support
type dxil_spv_option_nvapi (line 834) | typedef struct dxil_spv_option_nvapi
type dxil_spv_option_extended_non_semantic (line 842) | typedef struct dxil_spv_option_extended_non_semantic
type dxil_spv_option_view_instancing (line 849) | typedef struct dxil_spv_option_view_instancing
type dxil_spv_option_mixed_float_dot_product (line 859) | typedef struct dxil_spv_option_mixed_float_dot_product
type dxil_spv_option_compute_shader_derivatives_quad (line 866) | typedef struct dxil_spv_option_compute_shader_derivatives_quad
type dxil_spv_parsed_blob_s (line 877) | struct dxil_spv_parsed_blob_s
type dxil_spv_converter_s (line 939) | struct dxil_spv_converter_s
FILE: ir.hpp
type dxil_spv (line 36) | namespace dxil_spv
type MergeType (line 38) | enum class MergeType
type CFGNode (line 45) | struct CFGNode
type MergeInfo (line 46) | struct MergeInfo
type IncomingValue (line 55) | struct IncomingValue
type PHI (line 61) | struct PHI
type IDArgument (line 69) | struct IDArgument
method IDArgument (line 71) | explicit IDArgument(spv::Id id_)
type LiteralArgument (line 79) | struct LiteralArgument
method LiteralArgument (line 81) | explicit LiteralArgument(uint32_t lit_)
type Operation (line 89) | struct Operation
method Operation (line 96) | Operation() = default;
method Operation (line 98) | explicit Operation(spv::Op op_)
method Operation (line 103) | Operation(spv::Op op_, spv::Id id_, spv::Id type_id_)
method add_id (line 110) | void add_id(spv::Id arg)
method add_ids (line 117) | void add_ids(const std::initializer_list<spv::Id> &args)
method add_literal (line 126) | void add_literal(uint32_t lit)
method get_literal_mask (line 143) | uint8_t get_literal_mask() const
type Terminator (line 168) | struct Terminator
type Type (line 170) | enum class Type
type Case (line 186) | struct Case
type IRBlock (line 202) | struct IRBlock
FILE: llvm_bitcode_parser.cpp
type dxil_spv (line 35) | namespace dxil_spv
type LLVMBCParser::Impl (line 37) | struct LLVMBCParser::Impl
FILE: llvm_bitcode_parser.hpp
type dxbc_spv (line 37) | namespace dxbc_spv
type ir (line 39) | namespace ir
class Builder (line 41) | class Builder
type dxil_spv (line 45) | namespace dxil_spv
class LLVMBCParser (line 47) | class LLVMBCParser
type Impl (line 59) | struct Impl
FILE: memory_stream.cpp
type dxil_spv (line 28) | namespace dxil_spv
function MemoryStream (line 99) | MemoryStream MemoryStream::create_substream(size_t offset, size_t size...
function MemoryStream (line 107) | MemoryStream MemoryStream::create_substream(size_t offset) const
function MemoryStream (line 115) | MemoryStream MemoryStream::create_substream_bitcode_size(size_t offset...
FILE: memory_stream.hpp
type dxil_spv (line 31) | namespace dxil_spv
class MemoryStream (line 33) | class MemoryStream
method MemoryStream (line 37) | MemoryStream() = default;
method read (line 42) | bool read(T &buffer)
method T (line 50) | const T *map_read(size_t byte_size)
FILE: misc/structurize_test.cpp
type Emitter (line 41) | struct Emitter : BlockEmissionInterface
method register_block (line 44) | void register_block(CFGNode *node) override
function print_spirv_assembly (line 99) | static void print_spirv_assembly(const Vector<uint32_t> &code)
function print_glsl (line 109) | static void print_glsl(const Vector<uint32_t> &code)
function validate_spirv (line 145) | static void validate_spirv(const Vector<uint32_t> &code)
function tokenize (line 157) | static Vector<String> tokenize(char *line_buffer)
function main (line 177) | int main(int argc, char **argv)
FILE: node.cpp
type dxil_spv (line 32) | namespace dxil_spv
function CFGNode (line 318) | CFGNode *CFGNode::find_common_post_dominator(CFGNode *a, CFGNode *b)
function CFGNode (line 372) | CFGNode *CFGNode::find_common_dominator(CFGNode *a, CFGNode *b)
function CFGNode (line 436) | CFGNode *CFGNode::get_immediate_dominator_loop_header()
function CFGNode (line 452) | CFGNode *CFGNode::rewrite_branch_through_intermediate_node(CFGNode *to...
function CFGNode (line 621) | CFGNode *CFGNode::get_outer_selection_dominator()
function CFGNode (line 647) | CFGNode *CFGNode::get_outer_header_dominator()
FILE: node.hpp
type dxil_spv (line 33) | namespace dxil_spv
class CFGNodePool (line 35) | class CFGNodePool
type CFGNode (line 37) | struct CFGNode
FILE: node_pool.cpp
type dxil_spv (line 29) | namespace dxil_spv
function CFGNode (line 39) | CFGNode *CFGNodePool::create_node()
FILE: node_pool.hpp
type dxil_spv (line 30) | namespace dxil_spv
type CFGNode (line 32) | struct CFGNode
class CFGNodePool (line 34) | class CFGNodePool
method for_each_node (line 45) | void for_each_node(const Op &op)
FILE: opcodes/converter_impl.hpp
type LocalRootSignatureType (line 56) | enum class LocalRootSignatureType
type LocalRootSignatureConstants (line 63) | struct LocalRootSignatureConstants
type LocalRootSignatureDescriptor (line 70) | struct LocalRootSignatureDescriptor
type LocalRootSignatureEntry (line 77) | struct LocalRootSignatureEntry
type ReferenceVkMemoryModel (line 88) | struct ReferenceVkMemoryModel
function raw_width_to_component_type (line 94) | static inline DXIL::ComponentType raw_width_to_component_type(RawType ty...
function raw_vecsize_to_vecsize (line 109) | static inline unsigned raw_vecsize_to_vecsize(RawVecSize raw_vecsize)
function raw_component_type_to_bits (line 114) | static inline unsigned raw_component_type_to_bits(DXIL::ComponentType type)
function RawType (line 135) | static inline RawType raw_component_type_to_type(DXIL::ComponentType type)
function raw_width_to_bits (line 154) | static inline unsigned raw_width_to_bits(RawWidth raw_width)
type AllocaCBVForwardingTracking (line 161) | struct AllocaCBVForwardingTracking
class GlobalConfiguration (line 171) | class GlobalConfiguration
type AccessTracking (line 183) | struct AccessTracking
type Converter::Impl (line 194) | struct Converter::Impl
type BlockMeta (line 209) | struct BlockMeta
method BlockMeta (line 211) | explicit BlockMeta(llvm::BasicBlock *bb_)
type RawDeclaration (line 295) | struct RawDeclaration
type CompositeMeta (line 319) | struct CompositeMeta
type ResourceMetaReference (line 335) | struct ResourceMetaReference
type ResourceVariableMeta (line 346) | struct ResourceVariableMeta
type ExecutionModeMeta (line 353) | struct ExecutionModeMeta
type RawDeclarationVariable (line 416) | struct RawDeclarationVariable
type ResourceReference (line 422) | struct ResourceReference
type AnnotateHandleReference (line 443) | struct AnnotateHandleReference
type PhysicalPointerMeta (line 487) | struct PhysicalPointerMeta
type ResourceMetaInstrumentation (line 497) | struct ResourceMetaInstrumentation
type ResourceMeta (line 504) | struct ResourceMeta
type TempPayloadEntry (line 533) | struct TempPayloadEntry
type TypeLayoutFlagBits (line 547) | enum TypeLayoutFlagBits
type ElementMeta (line 559) | struct ElementMeta
type ElementPatchMeta (line 567) | struct ElementPatchMeta : ElementMeta
type ClipCullMeta (line 574) | struct ClipCullMeta
type NodeInputMeta (line 587) | struct NodeInputMeta
type NodeOutputMeta (line 616) | struct NodeOutputMeta
type StructTypeEntry (line 673) | struct StructTypeEntry
type ArrayTypeEntry (line 681) | struct ArrayTypeEntry
type SizeAlignment (line 692) | struct SizeAlignment
type BindlessInfo (line 861) | struct BindlessInfo
type BindlessResource (line 896) | struct BindlessResource
type CombinedImageSampler (line 903) | struct CombinedImageSampler
type PeepholeTransformation (line 912) | struct PeepholeTransformation
type PhysicalPointerEntry (line 929) | struct PhysicalPointerEntry
type RawBufferMeta (line 949) | struct RawBufferMeta
type AliasedAccess (line 958) | struct AliasedAccess
type Mapping (line 1010) | struct Mapping
type RootParameterMapping (line 1043) | struct RootParameterMapping
FILE: opcodes/dxil/dxil_ags.cpp
type dxil_spv (line 35) | namespace dxil_spv
function emit_magic_ags_atomic_u64 (line 37) | static bool emit_magic_ags_atomic_u64(Converter::Impl &impl, spv::Id i...
function make_fp8_type (line 118) | static spv::Id make_fp8_type(Converter::Impl &impl, bool load_store)
function get_type_data_format (line 128) | static inline uint32_t get_type_data_format(uint32_t imm)
function get_matrix_type (line 134) | static inline uint32_t get_matrix_type(uint32_t imm)
function get_matrix_shape (line 140) | static inline uint32_t get_matrix_shape(uint32_t imm)
function validate_convert_compatibility (line 146) | static bool validate_convert_compatibility(uint32_t imm_a, uint32_t im...
function convert_matrix_use (line 155) | static spv::CooperativeMatrixUse convert_matrix_use(uint32_t use)
function build_coopmat_type (line 170) | static spv::Id build_coopmat_type(Converter::Impl &impl, uint32_t imme...
function get_matrix_io_channel (line 210) | static inline uint32_t get_matrix_io_channel(uint32_t imm)
function get_matrix_io_register (line 216) | static inline uint32_t get_matrix_io_register(uint32_t imm)
function get_matrix_io_type (line 222) | static inline uint32_t get_matrix_io_type(uint32_t imm)
function validate_wmma_io_registers (line 228) | static bool validate_wmma_io_registers(Converter::Impl &impl, uint32_t...
function emit_wmma_return_values (line 315) | static bool emit_wmma_return_values(Converter::Impl &impl, spv::Id typ...
function emit_coopmat_transfer (line 337) | static spv::Id emit_coopmat_transfer(Converter::Impl &impl, spv::Id v,...
function emit_coopmat_broken_saturation_fixup (line 360) | static spv::Id emit_coopmat_broken_saturation_fixup(Converter::Impl &i...
function emit_coopmat_saturate_fp8 (line 379) | static spv::Id emit_coopmat_saturate_fp8(Converter::Impl &impl, spv::I...
function emit_coopmat_transpose_with_convert (line 398) | static spv::Id emit_coopmat_transpose_with_convert(
function emit_coopmat_transpose (line 521) | static spv::Id emit_coopmat_transpose(Converter::Impl &impl, spv::Id v...
function emit_fp8_to_fp16_coopmat (line 629) | static spv::Id emit_fp8_to_fp16_coopmat(Converter::Impl &impl, spv::Id...
function emit_fp16_to_fp8_coopmat (line 656) | static spv::Id emit_fp16_to_fp8_coopmat(Converter::Impl &impl, spv::Id...
function emit_wmma_length (line 683) | static bool emit_wmma_length(Converter::Impl &impl)
function build_packed_fp8_to_fp16_vec4 (line 715) | static spv::Id build_packed_fp8_to_fp16_vec4(Converter::Impl &impl, sp...
function emit_wmma_element_insert (line 756) | static bool emit_wmma_element_insert(Converter::Impl &impl)
function emit_wmma_element_extract (line 980) | static bool emit_wmma_element_extract(Converter::Impl &impl)
function emit_wmma_fill (line 1176) | static bool emit_wmma_fill(Converter::Impl &impl)
function emit_wmma_element_wise_arith (line 1303) | static bool emit_wmma_element_wise_arith(Converter::Impl &impl)
function emit_float8_conversion (line 1370) | static bool emit_float8_conversion(Converter::Impl &impl)
function get_matmul_result_type (line 1467) | static spv::Id get_matmul_result_type(Converter::Impl &impl, uint32_t ...
function emit_wmma_muladd (line 1492) | static bool emit_wmma_muladd(Converter::Impl &impl)
function emit_wmma_complex_convert (line 1531) | static spv::Id emit_wmma_complex_convert(Converter::Impl &impl, spv::I...
function emit_wmma_convert (line 1634) | static bool emit_wmma_convert(Converter::Impl &impl)
type WMMAAccessChain (line 1679) | struct WMMAAccessChain
function WMMAAccessChain (line 1686) | static WMMAAccessChain build_wmma_access_chain(
function emit_wmma_store (line 1766) | static bool emit_wmma_store(Converter::Impl &impl)
function emit_subgroup_barrier (line 1824) | static void emit_subgroup_barrier(Converter::Impl &impl)
function emit_wmma_load (line 1834) | static bool emit_wmma_load(Converter::Impl &impl)
function wmma_store_is_masked (line 1912) | bool wmma_store_is_masked(Converter::Impl &impl, const llvm::StoreInst...
function rewrite_gep_rdna3 (line 1925) | static spv::Id rewrite_gep_rdna3(Converter::Impl &impl, const llvm::Va...
function rewrite_alloca_gep_index (line 1987) | spv::Id rewrite_alloca_gep_index(Converter::Impl &impl, const llvm::Ge...
function is_gep_instruction (line 2036) | static bool is_gep_instruction(const llvm::Value *value)
function analyze_ags_wmma_store (line 2046) | bool analyze_ags_wmma_store(Converter::Impl &impl, const llvm::StoreIn...
function analyze_dubious_implementation_defined_column_behavior (line 2138) | static void analyze_dubious_implementation_defined_column_behavior(
function analyze_magic_ags_instruction (line 2174) | bool analyze_magic_ags_instruction(Converter::Impl &impl)
function emit_magic_ags_instruction (line 2261) | bool emit_magic_ags_instruction(Converter::Impl &impl, const llvm::Cal...
function push_ags_instruction (line 2527) | void push_ags_instruction(Converter::Impl &impl, const llvm::CallInst ...
function analyze_prepass_ags_dxil_atomic_op (line 2579) | bool analyze_prepass_ags_dxil_atomic_op(Converter::Impl &impl, const l...
function analyze_ags_dxil_cmpxchg_op (line 2593) | bool analyze_ags_dxil_cmpxchg_op(Converter::Impl &impl, const llvm::Ca...
function analyze_ags_buffer_load (line 2611) | bool analyze_ags_buffer_load(Converter::Impl &impl, const llvm::CallIn...
function analyze_ags_buffer_store (line 2641) | void analyze_ags_buffer_store(Converter::Impl &impl, const llvm::CallI...
function emit_ags_buffer_load (line 2664) | bool emit_ags_buffer_load(Converter::Impl &impl, const llvm::CallInst ...
function emit_ags_buffer_store (line 2680) | bool emit_ags_buffer_store(Converter::Impl &impl, const llvm::CallInst...
function emit_ags_texture_store (line 2693) | bool emit_ags_texture_store(Converter::Impl &impl, const llvm::CallIns...
function emit_ags_resource_uav_handle (line 2706) | bool emit_ags_resource_uav_handle(Converter::Impl &impl, const llvm::C...
function ags_llvm_load_filter (line 2724) | bool ags_llvm_load_filter(Converter::Impl &impl, Operation *op, const ...
function emit_ags_extract_value (line 2739) | bool emit_ags_extract_value(Converter::Impl &impl, const llvm::Extract...
function ags_alloca_or_global_filter (line 2750) | bool ags_alloca_or_global_filter(Converter::Impl &impl, const llvm::Va...
function emit_ags_atomicrmw (line 2772) | bool emit_ags_atomicrmw(Converter::Impl &impl, const llvm::AtomicRMWIn...
function emit_ags_getelementptr (line 2783) | bool emit_ags_getelementptr(Converter::Impl &impl, const llvm::GetElem...
function ags_getelementptr_filter (line 2802) | void ags_getelementptr_filter(Converter::Impl &impl, const llvm::GetEl...
function ags_build_cexpr_gep (line 2812) | static spv::Id ags_build_cexpr_gep(Converter::Impl &impl, const llvm::...
function ags_llvm_load_filter_cexpr (line 2863) | bool ags_llvm_load_filter_cexpr(Converter::Impl &impl, const llvm::Loa...
function ags_store_filter (line 2885) | bool ags_store_filter(Converter::Impl &impl, const llvm::StoreInst *in...
function ags_filter_phi (line 2905) | bool ags_filter_phi(Converter::Impl &impl, const llvm::PHINode &instru...
FILE: opcodes/dxil/dxil_ags.hpp
type dxil_spv (line 30) | namespace dxil_spv
type AmdExtD3DShaderIntrinsicsFloat8CvtOp (line 296) | enum AmdExtD3DShaderIntrinsicsFloat8CvtOp
type AmdExtD3DShaderIntrinsicsWaveMatrixOpDataFormat (line 320) | enum AmdExtD3DShaderIntrinsicsWaveMatrixOpDataFormat
type AmdExtD3DShaderIntrinsicsWaveMatrixOpMatrixType (line 341) | enum AmdExtD3DShaderIntrinsicsWaveMatrixOpMatrixType
type AmdExtD3DShaderIntrinsicsWaveMatrixOpMatrixShape (line 354) | enum AmdExtD3DShaderIntrinsicsWaveMatrixOpMatrixShape
type AmdExtD3DShaderIntrinsicsWaveMatrixOpcode (line 368) | enum AmdExtD3DShaderIntrinsicsWaveMatrixOpcode
type AmdExtD3DShaderIntrinsicsWaveMatrixRegType (line 418) | enum AmdExtD3DShaderIntrinsicsWaveMatrixRegType
type AmdExtD3DShaderIntrinsicsMatrixElementWiseOp (line 432) | enum AmdExtD3DShaderIntrinsicsMatrixElementWiseOp
type AmdExtD3DShaderIntrinsicsSparsityIndexMem (line 447) | enum AmdExtD3DShaderIntrinsicsSparsityIndexMem
function is_ags_magic (line 500) | static inline bool is_ags_magic(uint32_t v)
function AgsInstruction (line 505) | static inline AgsInstruction decode_ags_instruction(uint32_t v)
type AccessTracking (line 527) | struct AccessTracking
type AGSCoopMatMapping (line 548) | struct AGSCoopMatMapping
type AllocaAGSForwardingTracking (line 554) | struct AllocaAGSForwardingTracking
type AGSState (line 561) | struct AGSState
method reset (line 582) | void reset()
method reset_analysis (line 589) | void reset_analysis()
FILE: opcodes/dxil/dxil_arithmetic.cpp
type dxil_spv (line 32) | namespace dxil_spv
function emit_imad_instruction (line 34) | bool emit_imad_instruction(Converter::Impl &impl, const llvm::CallInst...
function emit_fmad_instruction (line 50) | bool emit_fmad_instruction(Converter::Impl &impl, const llvm::CallInst...
function emit_isfinite_instruction (line 102) | bool emit_isfinite_instruction(Converter::Impl &impl, const llvm::Call...
function emit_native_bitscan (line 125) | spv::Id emit_native_bitscan(GLSLstd450 opcode, Converter::Impl &impl,
function emit_find_low_bit_instruction (line 235) | bool emit_find_low_bit_instruction(Converter::Impl &impl, const llvm::...
function emit_find_high_bit_instruction (line 241) | bool emit_find_high_bit_instruction(GLSLstd450 opcode, Converter::Impl...
function emit_dxil_peephole_iabs (line 270) | static bool emit_dxil_peephole_iabs(GLSLstd450 opcode, Converter::Impl...
function emit_dxil_std450_binary_instruction (line 299) | bool emit_dxil_std450_binary_instruction(GLSLstd450 opcode, Converter:...
function emit_dxil_wide_arith_instruction (line 319) | bool emit_dxil_wide_arith_instruction(spv::Op opcode, Converter::Impl ...
function emit_dxbc_udiv_instruction (line 378) | bool emit_dxbc_udiv_instruction(Converter::Impl &impl, const llvm::Cal...
function emit_dxil_std450_trinary_instruction (line 416) | bool emit_dxil_std450_trinary_instruction(GLSLstd450 opcode, Converter...
function value_is_length_squared (line 434) | static bool value_is_length_squared(const llvm::Value *value)
function is_canonically_normalizing_value (line 454) | static bool is_canonically_normalizing_value(const llvm::Value *value)
function split_constant_multipliers (line 460) | static std::pair<const llvm::Value *, double> split_constant_multiplie...
function get_expression_upper_bound (line 487) | static bool get_expression_upper_bound(const llvm::Value *value, doubl...
function build_clamped_non_negative_sqrt (line 540) | static spv::Id build_clamped_non_negative_sqrt(Converter::Impl &impl, ...
function emit_dxil_std450_unary_instruction (line 566) | bool emit_dxil_std450_unary_instruction(GLSLstd450 opcode, Converter::...
function emit_dxil_unary_instruction (line 618) | bool emit_dxil_unary_instruction(spv::Op opcode, Converter::Impl &impl...
function emit_saturate_instruction (line 627) | bool emit_saturate_instruction(Converter::Impl &impl, const llvm::Call...
function emit_dot_instruction (line 675) | bool emit_dot_instruction(unsigned dimensions, Converter::Impl &impl, ...
function clamp_bitfield_width (line 700) | static spv::Id clamp_bitfield_width(Converter::Impl &impl, spv::Id off...
function mask_input (line 721) | static spv::Id mask_input(Converter::Impl &impl, const llvm::Value *va...
function emit_bfe_instruction (line 730) | bool emit_bfe_instruction(spv::Op opcode, Converter::Impl &impl, const...
function emit_bfi_instruction (line 753) | bool emit_bfi_instruction(Converter::Impl &impl, const llvm::CallInst ...
function emit_make_double_instruction (line 779) | bool emit_make_double_instruction(Converter::Impl &impl, const llvm::C...
function emit_split_double_instruction (line 798) | bool emit_split_double_instruction(Converter::Impl &impl, const llvm::...
function emit_legacy_f16_to_f32_instruction (line 812) | bool emit_legacy_f16_to_f32_instruction(Converter::Impl &impl, const l...
function emit_legacy_f32_to_f16_instruction (line 840) | bool emit_legacy_f32_to_f16_instruction(Converter::Impl &impl, const l...
function emit_bitcast_instruction (line 880) | bool emit_bitcast_instruction(Converter::Impl &impl, const llvm::CallI...
function build_bfe (line 888) | static spv::Id build_bfe(Converter::Impl &impl, spv::Id value_id, unsi...
function emit_i8_dot_instruction (line 899) | bool emit_i8_dot_instruction(Converter::Impl &impl, const llvm::CallIn...
function emit_dot2_add_half_instruction (line 948) | bool emit_dot2_add_half_instruction(Converter::Impl &impl, const llvm:...
function emit_unpack4x8_instruction (line 1028) | bool emit_unpack4x8_instruction(Converter::Impl &impl, const llvm::Cal...
function emit_pack4x8_instruction (line 1052) | bool emit_pack4x8_instruction(Converter::Impl &impl, const llvm::CallI...
function emit_msad_instruction (line 1116) | bool emit_msad_instruction(Converter::Impl &impl, const llvm::CallInst...
function emit_bit_reverse_instruction (line 1216) | bool emit_bit_reverse_instruction(Converter::Impl &impl, const llvm::C...
function emit_bit_count_instruction (line 1282) | bool emit_bit_count_instruction(Converter::Impl &impl, const llvm::Cal...
function emit_legacy_double_conv_instruction (line 1339) | bool emit_legacy_double_conv_instruction(spv::Op opcode, Converter::Im...
FILE: opcodes/dxil/dxil_arithmetic.hpp
type dxil_spv (line 29) | namespace dxil_spv
function emit_bfi_dispatch (line 51) | static inline bool emit_bfi_dispatch(Converter::Impl &impl, const llvm...
function emit_find_high_bit_dispatch (line 69) | static inline bool emit_find_high_bit_dispatch(Converter::Impl &impl, ...
function std450_trinary_dispatch (line 75) | static inline bool std450_trinary_dispatch(Converter::Impl &impl, cons...
function std450_binary_dispatch (line 81) | static inline bool std450_binary_dispatch(Converter::Impl &impl, const...
function std450_unary_dispatch (line 87) | static inline bool std450_unary_dispatch(Converter::Impl &impl, const ...
function unary_dispatch (line 93) | static inline bool unary_dispatch(Converter::Impl &impl, const llvm::C...
function wide_arith_dispatch (line 99) | static inline bool wide_arith_dispatch(Converter::Impl &impl, const ll...
function emit_dot_dispatch (line 105) | static inline bool emit_dot_dispatch(Converter::Impl &impl, const llvm...
function emit_bfe_dispatch (line 111) | static inline bool emit_bfe_dispatch(Converter::Impl &impl, const llvm...
function emit_i8_dot_instruction (line 118) | static inline bool emit_i8_dot_instruction(Converter::Impl &impl, cons...
function emit_legacy_double_conv_dispatch (line 135) | static inline bool emit_legacy_double_conv_dispatch(Converter::Impl &i...
FILE: opcodes/dxil/dxil_buffer.cpp
type dxil_spv (line 34) | namespace dxil_spv
function RawWidth (line 36) | static RawWidth get_buffer_access_bits_per_component(
function emit_buffer_synchronization_validation (line 51) | void emit_buffer_synchronization_validation(Converter::Impl &impl,
function raw_access_byte_address_can_vectorize (line 221) | bool raw_access_byte_address_can_vectorize(Converter::Impl &impl, cons...
function raw_access_structured_can_vectorize (line 246) | bool raw_access_structured_can_vectorize(
function RawVecSize (line 274) | RawVecSize raw_access_byte_address_vectorize(
function RawVecSize (line 288) | RawVecSize raw_access_structured_vectorize(
function build_accumulate_offsets (line 305) | static spv::Id build_accumulate_offsets(Converter::Impl &impl, const s...
function build_structured_index (line 333) | static spv::Id build_structured_index(Converter::Impl &impl, const llv...
function raw_buffer_data_type_to_addr_shift_log2 (line 408) | unsigned raw_buffer_data_type_to_addr_shift_log2(Converter::Impl &impl...
function BufferAccessInfo (line 419) | static BufferAccessInfo build_buffer_access(Converter::Impl &impl, con...
function build_physical_pointer_address_for_raw_load_store (line 541) | static spv::Id build_physical_pointer_address_for_raw_load_store(Conve...
function build_vectorized_physical_load_store_access (line 575) | static spv::Id build_vectorized_physical_load_store_access(Converter::...
function emit_physical_buffer_load_instruction (line 610) | static bool emit_physical_buffer_load_instruction(Converter::Impl &imp...
type RawAccessChain (line 712) | struct RawAccessChain
function buffer_access_is_raw_access_chain (line 720) | static bool buffer_access_is_raw_access_chain(Converter::Impl &impl, c...
function RawAccessChain (line 726) | static RawAccessChain emit_raw_access_chain(Converter::Impl &impl, con...
function emit_buffer_load_raw_chain_instruction (line 838) | static bool emit_buffer_load_raw_chain_instruction(Converter::Impl &im...
function emit_buffer_load_instruction (line 886) | bool emit_buffer_load_instruction(Converter::Impl &impl, const llvm::C...
function emit_physical_buffer_store_instruction (line 1215) | static bool emit_physical_buffer_store_instruction(Converter::Impl &im...
function emit_raw_buffer_load_instruction (line 1321) | bool emit_raw_buffer_load_instruction(Converter::Impl &impl, const llv...
function emit_buffer_store_values_bitcast (line 1353) | static unsigned emit_buffer_store_values_bitcast(Converter::Impl &impl...
function emit_buffer_store_instruction (line 1419) | bool emit_buffer_store_instruction(Converter::Impl &impl, const llvm::...
function emit_raw_buffer_store_instruction (line 1585) | bool emit_raw_buffer_store_instruction(Converter::Impl &impl, const ll...
function emit_atomic_access_chain (line 1613) | spv::Id emit_atomic_access_chain(Converter::Impl &impl,
function emit_atomic_binop_instruction (line 1659) | bool emit_atomic_binop_instruction(Converter::Impl &impl, const llvm::...
function emit_atomic_cmpxchg_instruction (line 1780) | bool emit_atomic_cmpxchg_instruction(Converter::Impl &impl, const llvm...
function emit_buffer_update_counter_instruction (line 1847) | bool emit_buffer_update_counter_instruction(Converter::Impl &impl, con...
FILE: opcodes/dxil/dxil_buffer.hpp
type dxil_spv (line 29) | namespace dxil_spv
type BufferAccessInfo (line 31) | struct BufferAccessInfo
FILE: opcodes/dxil/dxil_common.cpp
type dxil_spv (line 30) | namespace dxil_spv
function get_constant_operand (line 32) | bool get_constant_operand(const llvm::Instruction *value, unsigned ind...
function emit_u32x2_u32_add (line 48) | spv::Id emit_u32x2_u32_add(Converter::Impl &impl, spv::Id u32x2_value,...
function get_type_scalar_alignment (line 87) | unsigned get_type_scalar_alignment(Converter::Impl &impl, const llvm::...
function get_buffer_alias_handle (line 118) | spv::Id get_buffer_alias_handle(Converter::Impl &impl, const Converter...
function type_is_16bit (line 135) | bool type_is_16bit(const llvm::Type *data_type)
function type_is_64bit (line 142) | bool type_is_64bit(const llvm::Type *data_type)
function get_physical_load_store_cast_info (line 149) | void get_physical_load_store_cast_info(Converter::Impl &impl, const ll...
function build_index_divider_fallback (line 176) | static spv::Id build_index_divider_fallback(Converter::Impl &impl, con...
function extract_raw_buffer_access_split (line 186) | bool extract_raw_buffer_access_split(const llvm::Value *index, unsigne...
function build_index_divider (line 324) | spv::Id build_index_divider(Converter::Impl &impl, const llvm::Value *...
function build_load_invocation_id (line 379) | spv::Id build_load_invocation_id(Converter::Impl &impl)
function get_clip_cull_distance_access_chain (line 391) | spv::Id get_clip_cull_distance_access_chain(Converter::Impl &impl, con...
function emit_store_clip_cull_distance (line 471) | bool emit_store_clip_cull_distance(Converter::Impl &impl, const llvm::...
function value_is_dx_op_instrinsic (line 493) | bool value_is_dx_op_instrinsic(const llvm::Value *value, DXIL::Op op)
function emit_expect_assume_quad_uniform (line 511) | void emit_expect_assume_quad_uniform(Converter::Impl &impl)
function SplitScaleBias (line 530) | SplitScaleBias split_index_scale_bias(const llvm::Value *value)
function add_vkmm_access_qualifiers (line 571) | void add_vkmm_access_qualifiers(Converter::Impl &impl, Operation *op, ...
FILE: opcodes/dxil/dxil_common.hpp
type dxil_spv (line 30) | namespace dxil_spv
type RawBufferAccessSplit (line 45) | struct RawBufferAccessSplit
type SplitScaleBias (line 75) | struct SplitScaleBias
type ReferenceVkMemoryModel (line 84) | struct ReferenceVkMemoryModel
FILE: opcodes/dxil/dxil_compute.cpp
type dxil_spv (line 30) | namespace dxil_spv
function emit_barrier_instruction (line 32) | bool emit_barrier_instruction(Converter::Impl &impl, const llvm::CallI...
function get_compute_builtin_storage_class (line 88) | static spv::StorageClass get_compute_builtin_storage_class(Converter::...
function emit_thread_2d_quad_fixup_instruction (line 97) | static bool emit_thread_2d_quad_fixup_instruction(spv::BuiltIn builtin...
function emit_thread_id_load_instruction (line 238) | bool emit_thread_id_load_instruction(spv::BuiltIn builtin, Converter::...
FILE: opcodes/dxil/dxil_compute.hpp
type dxil_spv (line 29) | namespace dxil_spv
function emit_thread_id_load_dispatch (line 35) | static inline bool emit_thread_id_load_dispatch(Converter::Impl &impl,...
FILE: opcodes/dxil/dxil_geometry.cpp
type dxil_spv (line 30) | namespace dxil_spv
function emit_stream_instruction (line 32) | bool emit_stream_instruction(Converter::Impl &impl, const llvm::CallIn...
function emit_cut_stream_instruction (line 61) | bool emit_cut_stream_instruction(Converter::Impl &impl, const llvm::Ca...
function emit_then_cut_stream_instruction (line 86) | bool emit_then_cut_stream_instruction(Converter::Impl &impl, const llv...
function emit_gs_instance_instruction (line 93) | bool emit_gs_instance_instruction(Converter::Impl &impl, const llvm::C...
function emit_primitive_id_instruction (line 102) | bool emit_primitive_id_instruction(Converter::Impl &impl, const llvm::...
function emit_view_instance_ubo (line 115) | static bool emit_view_instance_ubo(Converter::Impl &impl)
function build_layer_offset_id (line 146) | spv::Id build_layer_offset_id(Converter::Impl &impl)
function should_emit_view_instancing_fixed_layer_viewport (line 180) | static bool should_emit_view_instancing_fixed_layer_viewport(Converter...
function emit_workgroup_unrolled_array_store (line 188) | static void emit_workgroup_unrolled_array_store(Converter::Impl &impl,
function emit_view_instancing_fixed_layer (line 228) | static bool emit_view_instancing_fixed_layer(Converter::Impl &impl, bo...
function build_viewport_offset_id (line 276) | spv::Id build_viewport_offset_id(Converter::Impl &impl)
function emit_view_instancing_fixed_viewport (line 311) | static bool emit_view_instancing_fixed_viewport(Converter::Impl &impl,...
function emit_view_instancing_fixed_layer_viewport (line 353) | bool emit_view_instancing_fixed_layer_viewport(Converter::Impl &impl, ...
function emit_view_masking (line 363) | bool emit_view_masking(Converter::Impl &impl)
function build_view_instance_id (line 435) | spv::Id build_view_instance_id(Converter::Impl &impl)
function emit_view_id_instruction (line 497) | bool emit_view_id_instruction(Converter::Impl &impl, const llvm::CallI...
FILE: opcodes/dxil/dxil_geometry.hpp
type dxil_spv (line 28) | namespace dxil_spv
FILE: opcodes/dxil/dxil_mesh.cpp
type dxil_spv (line 33) | namespace dxil_spv
function emit_set_mesh_output_counts_instruction (line 35) | bool emit_set_mesh_output_counts_instruction(Converter::Impl &impl, co...
function emit_emit_indices_instruction (line 167) | bool emit_emit_indices_instruction(Converter::Impl &impl, const llvm::...
function emit_store_vertex_output_instruction (line 199) | bool emit_store_vertex_output_instruction(Converter::Impl &impl, const...
function emit_store_primitive_output_instruction (line 253) | bool emit_store_primitive_output_instruction(Converter::Impl &impl, co...
function emit_dispatch_mesh_instruction (line 336) | bool emit_dispatch_mesh_instruction(Converter::Impl &impl, const llvm:...
function emit_get_mesh_payload_instruction (line 347) | bool emit_get_mesh_payload_instruction(Converter::Impl &impl, const ll...
FILE: opcodes/dxil/dxil_mesh.hpp
type dxil_spv (line 29) | namespace dxil_spv
FILE: opcodes/dxil/dxil_nvapi.cpp
type dxil_spv (line 12) | namespace dxil_spv
type NVExtnOp (line 14) | enum NVExtnOp
type NVSpecialOp (line 92) | enum NVSpecialOp
function get_argument (line 151) | static spv::Id get_argument(Converter::Impl &impl, uint32_t offset)
function get_argument_as_float (line 156) | static spv::Id get_argument_as_float(Converter::Impl &impl, uint32_t o...
function emit_nvapi_extn_op_shuffle (line 176) | static bool emit_nvapi_extn_op_shuffle(Converter::Impl &impl)
function emit_nvapi_extn_op_fp16x2_atomic (line 195) | static bool emit_nvapi_extn_op_fp16x2_atomic(Converter::Impl &impl)
function emit_nvapi_extn_op_get_special (line 247) | static bool emit_nvapi_extn_op_get_special(Converter::Impl &impl)
function emit_nvapi_extn_op_hit_object_trace_ray (line 281) | static bool emit_nvapi_extn_op_hit_object_trace_ray(Converter::Impl &i...
function emit_nvapi_extn_op_hit_object_make_hit (line 345) | static bool emit_nvapi_extn_op_hit_object_make_hit(Converter::Impl &im...
function emit_nvapi_extn_op_hit_object_make_miss (line 424) | static bool emit_nvapi_extn_op_hit_object_make_miss(Converter::Impl &i...
function emit_nvapi_extn_op_hit_object_reorder_thread (line 463) | static bool emit_nvapi_extn_op_hit_object_reorder_thread(Converter::Im...
function emit_nvapi_extn_op_hit_object_invoke (line 498) | static bool emit_nvapi_extn_op_hit_object_invoke(Converter::Impl &impl...
function emit_nvapi_extn_op_hit_object_get_bool (line 520) | static bool emit_nvapi_extn_op_hit_object_get_bool(Converter::Impl &im...
function emit_nvapi_extn_op_hit_object_get_uint (line 559) | static bool emit_nvapi_extn_op_hit_object_get_uint(Converter::Impl &im...
function emit_nvapi_extn_op_hit_object_get_ray_desc (line 610) | static bool emit_nvapi_extn_op_hit_object_get_ray_desc(Converter::Impl...
function emit_nvapi_extn_op_hit_object_get_attributes (line 659) | static bool emit_nvapi_extn_op_hit_object_get_attributes(Converter::Im...
function emit_nvapi_extn_op_hit_object_load_local_root_table_constant (line 681) | static bool emit_nvapi_extn_op_hit_object_load_local_root_table_consta...
function emit_nvapi_extn_op_hit_object_make_nop (line 741) | static bool emit_nvapi_extn_op_hit_object_make_nop(Converter::Impl &impl)
function emit_nvapi_extn_op_rt_get_cluster_id (line 758) | static bool emit_nvapi_extn_op_rt_get_cluster_id(Converter::Impl &impl)
function emit_nvapi_extn_op_rt_get_intersection_cluster_id (line 774) | static bool emit_nvapi_extn_op_rt_get_intersection_cluster_id(Converte...
function emit_nvapi_buffer_update_counter (line 1024) | bool emit_nvapi_buffer_update_counter(Converter::Impl &impl, const llv...
function analyze_nvapi_buffer_update_counter (line 1035) | bool analyze_nvapi_buffer_update_counter(Converter::Impl &impl, const ...
function nvapi_buffer_update_counter_filter (line 1053) | bool nvapi_buffer_update_counter_filter(Converter::Impl &impl, const l...
function mark_alloca_variable (line 1082) | static void mark_alloca_variable(Converter::Impl &impl, const llvm::Va...
function analyze_nvapi_call_shader (line 1101) | bool analyze_nvapi_call_shader(Converter::Impl &impl, const llvm::Call...
function analyze_nvapi_trace_ray (line 1122) | bool analyze_nvapi_trace_ray(Converter::Impl &impl, const llvm::CallIn...
function emit_nvapi_call_shader (line 1142) | bool emit_nvapi_call_shader(Converter::Impl &impl, const llvm::CallIns...
function emit_nvapi_trace_ray (line 1168) | bool emit_nvapi_trace_ray(Converter::Impl &impl, const llvm::CallInst ...
function emit_nvapi_resource_uav_handle (line 1202) | bool emit_nvapi_resource_uav_handle(Converter::Impl &impl, const llvm:...
function analyze_nvapi_buffer_load (line 1220) | bool analyze_nvapi_buffer_load(Converter::Impl &impl, const llvm::Call...
function analyze_nvapi_buffer_store (line 1232) | void analyze_nvapi_buffer_store(Converter::Impl &impl, const llvm::Cal...
function emit_nvapi_buffer_load (line 1245) | bool emit_nvapi_buffer_load(Converter::Impl &impl, const llvm::CallIns...
function emit_nvapi_buffer_store (line 1342) | bool emit_nvapi_buffer_store(Converter::Impl &impl, const llvm::CallIn...
FILE: opcodes/dxil/dxil_nvapi.hpp
type dxil_spv (line 9) | namespace dxil_spv
type NVAPIState (line 40) | struct NVAPIState
method reset_analysis (line 57) | void reset_analysis() {}
type AccessTracking (line 81) | struct AccessTracking
FILE: opcodes/dxil/dxil_pixel_ops.cpp
type dxil_spv (line 31) | namespace dxil_spv
function emit_discard_instruction (line 33) | bool emit_discard_instruction(Converter::Impl &impl, const llvm::CallI...
function emit_derivative_instruction_quad_coarse (line 53) | static bool emit_derivative_instruction_quad_coarse(
function emit_derivative_instruction_quad_fine (line 83) | static bool emit_derivative_instruction_quad_fine(
function emit_derivative_instruction_quad (line 135) | static bool emit_derivative_instruction_quad(spv::Op opcode, Converter...
function emit_extended_derivative_instruction (line 154) | bool emit_extended_derivative_instruction(Converter::Impl &impl, const...
function emit_derivative_instruction (line 188) | bool emit_derivative_instruction(spv::Op opcode, Converter::Impl &impl...
function emit_sample_index_instruction (line 288) | bool emit_sample_index_instruction(Converter::Impl &impl, const llvm::...
function emit_coverage_instruction (line 298) | bool emit_coverage_instruction(Converter::Impl &impl, const llvm::Call...
function emit_inner_coverage_instruction (line 315) | bool emit_inner_coverage_instruction(Converter::Impl &impl, const llvm...
function emit_is_helper_lane_instruction (line 345) | bool emit_is_helper_lane_instruction(Converter::Impl &impl, const llvm...
FILE: opcodes/dxil/dxil_pixel_ops.hpp
type dxil_spv (line 28) | namespace dxil_spv
function emit_derivative_dispatch (line 42) | static inline bool emit_derivative_dispatch(Converter::Impl &impl, con...
FILE: opcodes/dxil/dxil_ray_tracing.cpp
type dxil_spv (line 31) | namespace dxil_spv
function emit_temp_storage_copy (line 33) | spv::Id emit_temp_storage_copy(Converter::Impl &impl, const llvm::Valu...
function emit_temp_storage_resolve (line 55) | void emit_temp_storage_resolve(Converter::Impl &impl, const llvm::Valu...
function emit_trace_ray_instruction (line 73) | bool emit_trace_ray_instruction(Converter::Impl &impl, const llvm::Cal...
function emit_ray_tracing_builtin_load_instruction (line 131) | bool emit_ray_tracing_builtin_load_instruction(Converter::Impl &impl, ...
function emit_dispatch_rays_index_instruction (line 148) | bool emit_dispatch_rays_index_instruction(Converter::Impl &impl, const...
function emit_dispatch_rays_dimensions_instruction (line 154) | bool emit_dispatch_rays_dimensions_instruction(Converter::Impl &impl, ...
function emit_object_ray_origin_instruction (line 160) | bool emit_object_ray_origin_instruction(Converter::Impl &impl, const l...
function emit_world_ray_origin_instruction (line 166) | bool emit_world_ray_origin_instruction(Converter::Impl &impl, const ll...
function emit_object_ray_direction_instruction (line 172) | bool emit_object_ray_direction_instruction(Converter::Impl &impl, cons...
function emit_world_ray_direction_instruction (line 178) | bool emit_world_ray_direction_instruction(Converter::Impl &impl, const...
function emit_ray_t_min_instruction (line 184) | bool emit_ray_t_min_instruction(Converter::Impl &impl, const llvm::Cal...
function emit_ray_t_current_instruction (line 193) | bool emit_ray_t_current_instruction(Converter::Impl &impl, const llvm:...
function emit_ray_tracing_matrix_load (line 209) | static bool emit_ray_tracing_matrix_load(Converter::Impl &impl, const ...
function emit_ray_tracing_report_hit (line 228) | bool emit_ray_tracing_report_hit(Converter::Impl &impl, const llvm::Ca...
function emit_ray_tracing_accept_hit_and_end_search (line 247) | bool emit_ray_tracing_accept_hit_and_end_search(Converter::Impl &impl,...
function emit_ray_tracing_ignore_hit (line 254) | bool emit_ray_tracing_ignore_hit(Converter::Impl &impl, const llvm::Ca...
function emit_ray_tracing_call_shader (line 261) | bool emit_ray_tracing_call_shader(Converter::Impl &impl, const llvm::C...
function emit_world_to_object_instruction (line 285) | bool emit_world_to_object_instruction(Converter::Impl &impl, const llv...
function emit_object_to_world_instruction (line 290) | bool emit_object_to_world_instruction(Converter::Impl &impl, const llv...
function emit_ray_tracing_load_uint (line 295) | static bool emit_ray_tracing_load_uint(Converter::Impl &impl, const ll...
function emit_ray_tracing_instance_id_instruction (line 304) | bool emit_ray_tracing_instance_id_instruction(Converter::Impl &impl, c...
function emit_ray_tracing_instance_index_instruction (line 309) | bool emit_ray_tracing_instance_index_instruction(Converter::Impl &impl...
function emit_ray_tracing_geometry_index_instruction (line 314) | bool emit_ray_tracing_geometry_index_instruction(Converter::Impl &impl...
function emit_ray_tracing_primitive_index_instruction (line 319) | bool emit_ray_tracing_primitive_index_instruction(Converter::Impl &imp...
function emit_ray_tracing_ray_flags_instruction (line 324) | bool emit_ray_tracing_ray_flags_instruction(Converter::Impl &impl, con...
function emit_ray_tracing_hit_kind_instruction (line 329) | bool emit_ray_tracing_hit_kind_instruction(Converter::Impl &impl, cons...
function emit_ray_query_capabilities (line 334) | static void emit_ray_query_capabilities(Converter::Impl &impl)
function emit_allocate_ray_query (line 347) | bool emit_allocate_ray_query(Converter::Impl &impl, const llvm::CallIn...
function get_representative_ray_query_flags (line 372) | static bool get_representative_ray_query_flags(Converter::Impl &impl, ...
function build_ray_query_object (line 416) | bool build_ray_query_object(Converter::Impl &impl, const llvm::Value *...
function emit_ray_query_trace_ray_inline_instruction (line 457) | bool emit_ray_query_trace_ray_inline_instruction(Converter::Impl &impl...
function emit_ray_query_proceed_instruction (line 507) | bool emit_ray_query_proceed_instruction(Converter::Impl &impl, const l...
function emit_ray_query_abort_instruction (line 519) | bool emit_ray_query_abort_instruction(Converter::Impl &impl, const llv...
function emit_ray_query_intersection_type_instruction (line 531) | bool emit_ray_query_intersection_type_instruction(Converter::Impl &imp...
function emit_ray_query_system_value_instruction (line 546) | bool emit_ray_query_system_value_instruction(Converter::Impl &impl, co...
function emit_ray_query_get_value_instruction (line 577) | bool emit_ray_query_get_value_instruction(Converter::Impl &impl, const...
function emit_ray_query_get_matrix_value_instruction (line 610) | bool emit_ray_query_get_matrix_value_instruction(Converter::Impl &impl...
function emit_ray_query_commit_non_opaque_triangle_instruction (line 636) | bool emit_ray_query_commit_non_opaque_triangle_instruction(Converter::...
function emit_ray_query_commit_procedural_primitive_instruction (line 648) | bool emit_ray_query_commit_procedural_primitive_instruction(Converter:...
function emit_ray_query_candidate_procedural_primitive_non_opaque_instruction (line 661) | bool emit_ray_query_candidate_procedural_primitive_non_opaque_instruct...
FILE: opcodes/dxil/dxil_ray_tracing.hpp
type dxil_spv (line 29) | namespace dxil_spv
function emit_ray_query_intersection_type_instruction (line 70) | bool emit_ray_query_intersection_type_instruction(Converter::Impl &imp...
function emit_ray_query_system_value_instruction (line 78) | inline bool emit_ray_query_system_value_instruction(Converter::Impl &i...
function emit_ray_query_get_value_instruction (line 86) | inline bool emit_ray_query_get_value_instruction(Converter::Impl &impl...
function emit_ray_query_get_matrix_value_instruction (line 94) | inline bool emit_ray_query_get_matrix_value_instruction(Converter::Imp...
FILE: opcodes/dxil/dxil_resources.cpp
type dxil_spv (line 36) | namespace dxil_spv
function emit_load_clip_cull_distance (line 47) | static bool emit_load_clip_cull_distance(Converter::Impl &impl, const ...
function fixup_builtin_load (line 58) | static void fixup_builtin_load(Converter::Impl &impl, spv::Id var_id, ...
function get_builtin_load_type (line 108) | static spv::Id get_builtin_load_type(Converter::Impl &impl, const Conv...
function emit_amd_bary_coord_load (line 117) | static bool emit_amd_bary_coord_load(Converter::Impl &impl, const llvm...
function emit_load_input_instruction (line 166) | bool emit_load_input_instruction(Converter::Impl &impl, const llvm::Ca...
function build_attribute_offset (line 294) | static spv::Id build_attribute_offset(spv::Id id, Converter::Impl &impl)
function emit_interpolate_instruction (line 323) | bool emit_interpolate_instruction(GLSLstd450 opcode, Converter::Impl &...
function emit_store_output_instruction (line 420) | bool emit_store_output_instruction(Converter::Impl &impl, const llvm::...
function emit_load_draw_parameter_instruction (line 535) | bool emit_load_draw_parameter_instruction(spv::BuiltIn builtin, Conver...
function emit_load_control_point_count_in (line 548) | bool emit_load_control_point_count_in(Converter::Impl &impl, const llv...
function build_bindless_heap_offset (line 557) | static spv::Id build_bindless_heap_offset(Converter::Impl &impl,
function build_adjusted_descriptor_indexing (line 632) | static spv::Id build_adjusted_descriptor_indexing(Converter::Impl &impl,
function build_bindless_heap_offset_shader_record (line 639) | static spv::Id build_bindless_heap_offset_shader_record(Converter::Imp...
function build_bindless_heap_offset_push_constant (line 691) | static spv::Id build_bindless_heap_offset_push_constant(Converter::Imp...
function build_descriptor_qa_check (line 728) | static spv::Id build_descriptor_qa_check(Converter::Impl &impl, spv::I...
function build_descriptor_heap_robustness (line 751) | static spv::Id build_descriptor_heap_robustness(Converter::Impl &impl,...
function build_bindless_heap_offset (line 812) | static spv::Id build_bindless_heap_offset(Converter::Impl &impl,
function build_physical_address_indexing_from_ssbo (line 851) | static spv::Id build_physical_address_indexing_from_ssbo(Converter::Im...
function build_load_physical_uav_counter (line 876) | static spv::Id build_load_physical_uav_counter(Converter::Impl &impl, ...
function get_resource_storage_class (line 951) | static spv::StorageClass get_resource_storage_class(Converter::Impl &i...
function build_resource_bda_instrumentation (line 961) | static void build_resource_bda_instrumentation(Converter::Impl &impl, ...
function build_instrumentation_size_query (line 1001) | static spv::Id build_instrumentation_size_query(Converter::Impl &impl,
function build_load_resource_handle (line 1067) | static bool build_load_resource_handle(Converter::Impl &impl, spv::Id ...
function build_shader_record_access_chain (line 1214) | static spv::Id build_shader_record_access_chain(Converter::Impl &impl,...
function build_root_descriptor_access_chain (line 1246) | static spv::Id build_root_descriptor_access_chain(Converter::Impl &imp...
function build_root_descriptor_load_physical_pointer (line 1261) | static spv::Id build_root_descriptor_load_physical_pointer(Converter::...
function build_load_physical_rtas (line 1286) | static spv::Id build_load_physical_rtas(Converter::Impl &impl, const C...
function resource_is_physical_rtas (line 1335) | static bool resource_is_physical_rtas(Converter::Impl &impl, const Con...
function resource_is_physical_pointer (line 1350) | static bool resource_is_physical_pointer(Converter::Impl &impl, const ...
function build_load_buffer_offset (line 1358) | static spv::Id build_load_buffer_offset(Converter::Impl &impl, Convert...
function resource_kind_is_buffer (line 1444) | static bool resource_kind_is_buffer(DXIL::ResourceKind kind)
function get_offset_buffer_variable (line 1493) | static spv::Id get_offset_buffer_variable(
function emit_create_handle (line 1505) | static bool emit_create_handle(Converter::Impl &impl, const llvm::Call...
function resource_handle_needs_sink (line 1978) | static bool resource_handle_needs_sink(Converter::Impl &impl, const ll...
function emit_create_handle_for_lib_instruction (line 1985) | bool emit_create_handle_for_lib_instruction(Converter::Impl &impl, con...
function emit_create_handle_instruction (line 2005) | bool emit_create_handle_instruction(Converter::Impl &impl, const llvm:...
function emit_create_handle_from_heap_instruction (line 2028) | bool emit_create_handle_from_heap_instruction(Converter::Impl &, const...
function emit_create_handle_from_binding_instruction (line 2034) | bool emit_create_handle_from_binding_instruction(Converter::Impl &, co...
function get_annotate_handle_meta (line 2040) | bool get_annotate_handle_meta(Converter::Impl &impl, const llvm::CallI...
function emit_annotate_handle_instruction (line 2119) | bool emit_annotate_handle_instruction(Converter::Impl &impl, const llv...
function build_bitcast_32x4_to_16x8_composite (line 2135) | static bool build_bitcast_32x4_to_16x8_composite(Converter::Impl &impl...
function emit_cbuffer_load_physical_pointer (line 2183) | static bool emit_cbuffer_load_physical_pointer(Converter::Impl &impl, ...
function emit_cbuffer_load_from_uints (line 2322) | static bool emit_cbuffer_load_from_uints(Converter::Impl &impl, const ...
function emit_cbuffer_load_shader_record (line 2545) | static bool emit_cbuffer_load_shader_record(Converter::Impl &impl, con...
function emit_cbuffer_load_root_constant (line 2556) | static bool emit_cbuffer_load_root_constant(Converter::Impl &impl, con...
function cbuffer_supports_gep_punchthrough (line 2565) | bool cbuffer_supports_gep_punchthrough(Converter::Impl &impl, const ll...
function emit_gep_as_cbuffer_scalar_offset (line 2592) | bool emit_gep_as_cbuffer_scalar_offset(Converter::Impl &impl, const ll...
function emit_cbuffer_load_instruction (line 2709) | bool emit_cbuffer_load_instruction(Converter::Impl &impl, const llvm::...
function type_is_composite_return_value (line 2814) | bool type_is_composite_return_value(llvm::Type *type)
function emit_cbuffer_load_legacy_instruction (line 2828) | bool emit_cbuffer_load_legacy_instruction(Converter::Impl &impl, const...
function resource_handle_is_uniform_readonly_descriptor (line 2946) | bool resource_handle_is_uniform_readonly_descriptor(Converter::Impl &i...
FILE: opcodes/dxil/dxil_resources.hpp
type dxil_spv (line 30) | namespace dxil_spv
function emit_load_input_dispatch (line 35) | static bool emit_load_input_dispatch(Converter::Impl &impl, const llvm...
function emit_interpolate_dispatch (line 56) | static inline bool emit_interpolate_dispatch(Converter::Impl &impl, co...
function emit_load_draw_parameter_dispatch (line 62) | static inline bool emit_load_draw_parameter_dispatch(Converter::Impl &...
type AnnotateHandleMeta (line 69) | struct AnnotateHandleMeta
FILE: opcodes/dxil/dxil_sampling.cpp
type dxil_spv (line 33) | namespace dxil_spv
function get_image_dimensions_query_size (line 35) | bool get_image_dimensions_query_size(Converter::Impl &impl, spv::Build...
function get_image_dimensions (line 73) | bool get_image_dimensions(Converter::Impl &impl, spv::Id image_id, uin...
function build_texel_offset_vector (line 109) | static spv::Id build_texel_offset_vector(Converter::Impl &impl,
function get_texel_offsets (line 140) | static bool get_texel_offsets(Converter::Impl &impl, const llvm::CallI...
function build_gradient (line 205) | static void build_gradient(Converter::Impl &impl, const spv::Id *coord...
function emit_workaround_clamp_cube_mips (line 269) | static spv::Id emit_workaround_clamp_cube_mips(Converter::Impl &impl, ...
function emit_sample_instruction (line 304) | bool emit_sample_instruction(DXIL::Op opcode, Converter::Impl &impl, c...
function binary_op_is_multiple_of_derivative (line 543) | static bool binary_op_is_multiple_of_derivative(const llvm::Value *gra...
function sample_grad_is_lod_bias (line 583) | static spv::Id sample_grad_is_lod_bias(Converter::Impl &impl, const ll...
function emit_sample_grad_instruction (line 694) | bool emit_sample_grad_instruction(DXIL::Op opcode, Converter::Impl &im...
function emit_texture_load_instruction (line 849) | bool emit_texture_load_instruction(Converter::Impl &impl, const llvm::...
function emit_get_dimensions_instruction (line 976) | bool emit_get_dimensions_instruction(Converter::Impl &impl, const llvm...
function emit_texture_store_instruction_dispatch (line 1192) | bool emit_texture_store_instruction_dispatch(Converter::Impl &impl, co...
function emit_texture_gather_instruction (line 1252) | bool emit_texture_gather_instruction(bool compare, bool raw, Converter...
function build_lod_from_gradient (line 1413) | static spv::Id build_lod_from_gradient(Converter::Impl &impl, spv::Id ...
function emit_cube_extract_str (line 1452) | static spv::Id emit_cube_extract_str(Converter::Impl &impl, spv::Id co...
function emit_calculate_lod_cube_gradient_transform (line 1500) | static void emit_calculate_lod_cube_gradient_transform(Converter::Impl...
function emit_calculate_lod_instruction_fallback (line 1664) | static bool emit_calculate_lod_instruction_fallback(Converter::Impl &i...
function emit_calculate_lod_instruction (line 1812) | bool emit_calculate_lod_instruction(Converter::Impl &impl, const llvm:...
function build_sample_position_lut (line 1876) | static void build_sample_position_lut(Converter::Impl &impl)
function build_rasterizer_sample_count (line 1941) | static spv::Id build_rasterizer_sample_count(Converter::Impl &impl)
function emit_get_render_target_sample_count (line 1958) | bool emit_get_render_target_sample_count(Converter::Impl &impl, const ...
function emit_check_access_fully_mapped_instruction (line 1964) | bool emit_check_access_fully_mapped_instruction(Converter::Impl &impl,...
function emit_get_sample_position (line 1974) | bool emit_get_sample_position(Converter::Impl &impl, const llvm::CallI...
function emit_query_size (line 2040) | static spv::Id emit_query_size(Converter::Impl &impl, spv::Id image_id,
function emit_accessed_lod (line 2072) | static spv::Id emit_accessed_lod(DXIL::Op opcode, Converter::Impl &imp...
function emit_mip_region_size_log2 (line 2229) | static spv::Id emit_mip_region_size_log2(Converter::Impl &impl, const ...
type ScalingFactors (line 2270) | struct ScalingFactors
function ScalingFactors (line 2277) | static ScalingFactors emit_scaling_factor_to_mip_region_space(
function emit_max_level (line 2314) | static spv::Id emit_max_level(Converter::Impl &impl, spv::Id image_id)
type LodSelection (line 2331) | struct LodSelection
function LodSelection (line 2338) | static LodSelection emit_trilinear_lods(Converter::Impl &impl, spv::Id...
function emit_gradient_extent_normalized (line 2381) | static spv::Id emit_gradient_extent_normalized(Converter::Impl &impl, ...
function emit_write_sampler_feedback_instruction (line 2461) | bool emit_write_sampler_feedback_instruction(DXIL::Op opcode, Converte...
FILE: opcodes/dxil/dxil_sampling.hpp
type dxil_spv (line 28) | namespace dxil_spv
function emit_get_dimensions_dispatch (line 40) | bool emit_get_dimensions_dispatch(Converter::Impl &impl, const llvm::C...
function emit_calculate_lod_dispatch (line 48) | bool emit_calculate_lod_dispatch(Converter::Impl &impl, const llvm::Ca...
function emit_write_sampler_feedback_instruction (line 61) | bool emit_write_sampler_feedback_instruction(Converter::Impl &impl, co...
function emit_sample_instruction_dispatch (line 67) | static inline bool emit_sample_instruction_dispatch(Converter::Impl &i...
function emit_sample_grad_instruction_dispatch (line 73) | static inline bool emit_sample_grad_instruction_dispatch(Converter::Im...
function emit_texture_store_instruction (line 79) | static inline bool emit_texture_store_instruction(Converter::Impl &imp...
function emit_texture_gather_dispatch (line 85) | static inline bool emit_texture_gather_dispatch(Converter::Impl &impl,...
function emit_get_sample_position_dispatch (line 91) | static inline bool emit_get_sample_position_dispatch(Converter::Impl &...
FILE: opcodes/dxil/dxil_tessellation.cpp
type dxil_spv (line 31) | namespace dxil_spv
function emit_store_patch_constant_instruction (line 33) | bool emit_store_patch_constant_instruction(Converter::Impl &impl, cons...
function emit_load_output_generic_instruction (line 177) | bool emit_load_output_generic_instruction(Converter::Impl &impl, const...
function emit_domain_location_instruction (line 238) | bool emit_domain_location_instruction(Converter::Impl &impl, const llv...
function emit_output_control_point_instruction (line 257) | bool emit_output_control_point_instruction(Converter::Impl &impl, cons...
function emit_load_patch_constant_instruction (line 268) | bool emit_load_patch_constant_instruction(Converter::Impl &impl, const...
FILE: opcodes/dxil/dxil_tessellation.hpp
type dxil_spv (line 28) | namespace dxil_spv
FILE: opcodes/dxil/dxil_waveops.cpp
type dxil_spv (line 32) | namespace dxil_spv
function wave_op_needs_helper_lane_masking (line 34) | static bool wave_op_needs_helper_lane_masking(Converter::Impl &impl)
function emit_wave_is_first_lane_instruction (line 41) | bool emit_wave_is_first_lane_instruction(Converter::Impl &impl, const ...
function add_vkmm_volatile (line 68) | static void add_vkmm_volatile(Converter::Impl &impl, Operation *op, sp...
function emit_wave_builtin_instruction (line 77) | bool emit_wave_builtin_instruction(spv::BuiltIn builtin, Converter::Im...
function emit_wave_boolean_instruction (line 95) | bool emit_wave_boolean_instruction(spv::Op opcode, Converter::Impl &im...
function build_masked_ballot (line 163) | static spv::Id build_masked_ballot(Converter::Impl &impl, spv::Id inpu...
function emit_wave_ballot_instruction (line 181) | bool emit_wave_ballot_instruction(Converter::Impl &impl, const llvm::C...
function value_is_statically_wave_uniform (line 200) | bool value_is_statically_wave_uniform(Converter::Impl &impl, const llv...
function value_depends_on_dxil_op (line 272) | static bool value_depends_on_dxil_op(
function value_is_likely_non_uniform (line 302) | bool value_is_likely_non_uniform(Converter::Impl &, const llvm::Value ...
function value_is_local_invocation_index_dependent (line 316) | static bool value_is_local_invocation_index_dependent(const llvm::Valu...
function emit_wave_read_lane_first_instruction (line 330) | bool emit_wave_read_lane_first_instruction(Converter::Impl &impl, cons...
function execution_model_can_quad_op (line 366) | static bool execution_model_can_quad_op(spv::ExecutionModel model)
function value_is_wave_lane (line 372) | static bool value_is_wave_lane(const llvm::Value *value)
function get_constant_int (line 387) | static bool get_constant_int(const llvm::Value *value, uint32_t *const...
function get_constant_xor_lane (line 398) | static bool get_constant_xor_lane(const llvm::Value *lane, uint32_t *x...
function get_constant_quad_lane (line 420) | static bool get_constant_quad_lane(const llvm::Value *lane, uint32_t *...
function lane_is_wave32_masked (line 478) | static bool lane_is_wave32_masked(const llvm::Value *lane)
function emit_wave_read_lane_at_instruction (line 503) | bool emit_wave_read_lane_at_instruction(Converter::Impl &impl, const l...
function emit_wave_bit_count_instruction (line 590) | bool emit_wave_bit_count_instruction(spv::GroupOperation operation, Co...
function select_opcode (line 615) | static spv::Op select_opcode(const llvm::CallInst *instruction, spv::O...
function build_mask_reduction_input_arith (line 629) | static spv::Id build_mask_reduction_input_arith(Converter::Impl &impl,...
function build_mask_reduction_input_bitwise (line 741) | static spv::Id build_mask_reduction_input_bitwise(Converter::Impl &imp...
function select_opcode (line 782) | static spv::Op select_opcode(const llvm::CallInst *instruction, spv::O...
function emit_wave_active_op_instruction (line 790) | bool emit_wave_active_op_instruction(Converter::Impl &impl, const llvm...
function emit_wave_prefix_op_instruction (line 857) | bool emit_wave_prefix_op_instruction(Converter::Impl &impl, const llvm...
function emit_wave_multi_prefix_count_bits_instruction (line 897) | bool emit_wave_multi_prefix_count_bits_instruction(Converter::Impl &im...
function emit_masked_ballot (line 927) | static spv::Id emit_masked_ballot(Converter::Impl &impl, spv::Id value)
function emit_wave_multi_prefix_op_instruction (line 994) | bool emit_wave_multi_prefix_op_instruction(Converter::Impl &impl, cons...
function emit_wave_active_bit_instruction (line 1084) | bool emit_wave_active_bit_instruction(Converter::Impl &impl, const llv...
function emit_wave_quad_vote_instruction (line 1125) | bool emit_wave_quad_vote_instruction(Converter::Impl &impl, const llvm...
function emit_wave_quad_op_instruction (line 1163) | bool emit_wave_quad_op_instruction(Converter::Impl &impl, const llvm::...
function emit_current_ballot_value (line 1205) | static spv::Id emit_current_ballot_value(Converter::Impl &impl)
function emit_current_subgroup_quad_index (line 1225) | static spv::Id emit_current_subgroup_quad_index(Converter::Impl &impl)
function emit_current_quad_lane_active (line 1247) | spv::Id emit_current_quad_lane_active(Converter::Impl &impl, uint32_t ...
function emit_wave_quad_read_lane_at_instruction (line 1270) | bool emit_wave_quad_read_lane_at_instruction(Converter::Impl &impl, co...
function emit_wave_match_instruction (line 1356) | bool emit_wave_match_instruction(Converter::Impl &impl, const llvm::Ca...
FILE: opcodes/dxil/dxil_waveops.hpp
type dxil_spv (line 28) | namespace dxil_spv
function emit_wave_bit_count_dispatch (line 51) | static inline bool emit_wave_bit_count_dispatch(Converter::Impl &impl,...
function emit_wave_boolean_dispatch (line 57) | static inline bool emit_wave_boolean_dispatch(Converter::Impl &impl, c...
function emit_wave_builtin_dispatch (line 63) | static inline bool emit_wave_builtin_dispatch(Converter::Impl &impl, c...
FILE: opcodes/dxil/dxil_workgraph.cpp
type dxil_spv (line 32) | namespace dxil_spv
function get_node_io_from_annotate_handle (line 34) | uint32_t get_node_io_from_annotate_handle(const llvm::CallInst *inst)
function get_node_stride_from_annotate_handle (line 41) | static uint32_t get_node_stride_from_annotate_handle(const llvm::CallI...
function get_node_meta_index_from_annotate_handle (line 63) | static uint32_t get_node_meta_index_from_annotate_handle(const llvm::C...
function emit_load_node_input_push_parameter (line 84) | spv::Id emit_load_node_input_push_parameter(
function emit_load_node_input_push_pointer (line 100) | static spv::Id emit_load_node_input_push_pointer(
function emit_build_output_payload_offset (line 118) | static spv::Id emit_build_output_payload_offset(
function emit_build_input_payload_offset (line 135) | static spv::Id emit_build_input_payload_offset(Converter::Impl &impl, ...
function emit_allocate_node_output_records (line 178) | bool emit_allocate_node_output_records(Converter::Impl &impl, const ll...
function emit_get_node_record_ptr (line 218) | bool emit_get_node_record_ptr(Converter::Impl &impl, const llvm::CallI...
function emit_increment_output_count (line 315) | bool emit_increment_output_count(Converter::Impl &impl, const llvm::Ca...
function emit_output_complete (line 343) | bool emit_output_complete(Converter::Impl &impl, const llvm::CallInst ...
function emit_get_input_record_count (line 348) | bool emit_get_input_record_count(Converter::Impl &impl, const llvm::Ca...
function emit_finished_cross_group_sharing (line 357) | bool emit_finished_cross_group_sharing(Converter::Impl &impl, const ll...
function emit_barrier (line 380) | static bool emit_barrier(Converter::Impl &impl, uint32_t memory_flags,...
function emit_barrier_by_memory_type (line 420) | bool emit_barrier_by_memory_type(Converter::Impl &impl, const llvm::Ca...
function emit_barrier_by_memory_handle (line 433) | bool emit_barrier_by_memory_handle(Converter::Impl &impl, const llvm::...
function emit_barrier_by_node_record_handle (line 448) | bool emit_barrier_by_node_record_handle(Converter::Impl &impl, const l...
function emit_index_node_handle (line 469) | bool emit_index_node_handle(Converter::Impl &impl, const llvm::CallIns...
function emit_annotate_node_handle (line 480) | bool emit_annotate_node_handle(Converter::Impl &impl, const llvm::Call...
function emit_create_node_input_record_handle (line 506) | bool emit_create_node_input_record_handle(Converter::Impl &, const llv...
function emit_create_node_output_handle (line 513) | bool emit_create_node_output_handle(Converter::Impl &, const llvm::Cal...
function emit_annotate_node_record_handle (line 519) | bool emit_annotate_node_record_handle(Converter::Impl &, const llvm::C...
function emit_node_output_is_valid (line 525) | bool emit_node_output_is_valid(Converter::Impl &impl, const llvm::Call...
function emit_get_remaining_recursion_levels (line 551) | bool emit_get_remaining_recursion_levels(Converter::Impl &impl, const ...
function emit_real_builtin_id (line 559) | static spv::Id emit_real_builtin_id(Converter::Impl &impl, spv::Id &id...
function emit_real_workgroup_id (line 574) | static spv::Id emit_real_workgroup_id(Converter::Impl &impl)
function emit_real_global_invocation_id (line 579) | static spv::Id emit_real_global_invocation_id(Converter::Impl &impl)
function emit_linear_node_index (line 584) | static spv::Id emit_linear_node_index(Converter::Impl &impl)
function emit_payload_pointer_resolve (line 676) | static bool emit_payload_pointer_resolve(Converter::Impl &impl, spv::I...
function emit_dispatch_bit_count (line 783) | static spv::Id emit_dispatch_bit_count(Converter::Impl &impl, spv::Id ...
function CFGNode (line 801) | static CFGNode *emit_workgraph_dispatcher_path_broadcast_static_payload(
function CFGNode (line 837) | static CFGNode *emit_workgraph_dispatcher_path_broadcast_amplified(
function CFGNode (line 1195) | static CFGNode *emit_workgraph_dispatcher_path_broadcast(
function CFGNode (line 1239) | static CFGNode *emit_workgraph_dispatcher_path_thread(
function CFGNode (line 1278) | static CFGNode *emit_workgraph_dispatcher_path_coalescing(
function CFGNode (line 1290) | static CFGNode *emit_workgraph_dispatcher_path(
function emit_workgraph_dispatcher (line 1328) | bool emit_workgraph_dispatcher(Converter::Impl &impl, CFGNodePool &poo...
FILE: opcodes/dxil/dxil_workgraph.hpp
type dxil_spv (line 28) | namespace dxil_spv
type NodeInputParameter (line 49) | enum NodeInputParameter
type NodeSpecConstant (line 62) | enum NodeSpecConstant
FILE: opcodes/opcodes.hpp
type dxil_spv (line 42) | namespace dxil_spv
type RawType (line 44) | enum class RawType { Integer, Float, Count }
type RawWidth (line 45) | enum class RawWidth { B8 = 0, B16, B32, B64, Count }
type RawVecSize (line 46) | enum class RawVecSize { V1 = 0, V2, V3, V4, Count }
type MagicResource (line 48) | enum class MagicResource : uint8_t
type AgsInstruction (line 54) | struct AgsInstruction
FILE: opcodes/opcodes_dxil_builtins.cpp
type dxil_spv (line 44) | namespace dxil_spv
type DXILDispatcher (line 46) | struct DXILDispatcher
method DXILDispatcher (line 49) | DXILDispatcher() noexcept
function emit_dxil_instruction (line 422) | bool emit_dxil_instruction(Converter::Impl &impl, const llvm::CallInst...
function dxil_instruction_has_side_effects (line 449) | bool dxil_instruction_has_side_effects(const llvm::CallInst *instruction)
function update_raw_access_tracking_from_vector_type (line 507) | static void update_raw_access_tracking_from_vector_type(
function update_raw_access_tracking_from_scalar_type (line 528) | static void update_raw_access_tracking_from_scalar_type(AccessTracking...
function update_raw_access_tracking_for_byte_address (line 533) | static void update_raw_access_tracking_for_byte_address(
function update_raw_access_tracking_for_structured (line 549) | static void update_raw_access_tracking_for_structured(
function analyze_descriptor_handle_sink (line 565) | static void analyze_descriptor_handle_sink(Converter::Impl &impl,
function get_resource_meta_from_buffer_op (line 600) | static Converter::Impl::RawBufferMeta
function analyze_alloca_cbv_forwarding_pre_resource_emit (line 619) | bool analyze_alloca_cbv_forwarding_pre_resource_emit(Converter::Impl &...
function analyze_alloca_cbv_forwarding_post_resource_emit (line 660) | bool analyze_alloca_cbv_forwarding_post_resource_emit(Converter::Impl ...
function analyze_dxil_cbuffer_load (line 675) | static void analyze_dxil_cbuffer_load(Converter::Impl &impl, const llv...
function analyze_dxil_atomic_counter (line 749) | static void analyze_dxil_atomic_counter(Converter::Impl &impl, const l...
function analyze_dxil_buffer_load (line 764) | static void analyze_dxil_buffer_load(Converter::Impl &impl, const llvm...
function analyze_dxil_buffer_store (line 828) | static void analyze_dxil_buffer_store(Converter::Impl &impl, const llv...
function analyze_dxil_atomic_op (line 876) | static bool analyze_dxil_atomic_op(Converter::Impl &impl, const llvm::...
function analyze_dxil_instruction_secondary_pass (line 927) | bool analyze_dxil_instruction_secondary_pass(Converter::Impl &impl, co...
function analyze_dxil_instruction_primary_pass (line 1042) | bool analyze_dxil_instruction_primary_pass(Converter::Impl &impl, cons...
FILE: opcodes/opcodes_dxil_builtins.hpp
type dxil_spv (line 29) | namespace dxil_spv
type AllocaCBVForwardingTracking (line 38) | struct AllocaCBVForwardingTracking
FILE: opcodes/opcodes_llvm_builtins.cpp
type dxil_spv (line 35) | namespace dxil_spv
function physical_integer_bit_width (line 37) | unsigned physical_integer_bit_width(unsigned width)
function instruction_is_ballot (line 53) | static bool instruction_is_ballot(const llvm::Value *aggregate)
function build_naturally_extended_value (line 72) | static spv::Id build_naturally_extended_value(Converter::Impl &impl, c...
function build_naturally_extended_value (line 97) | static spv::Id build_naturally_extended_value(Converter::Impl &impl, c...
function emit_fixup_fdiv_sqrt (line 107) | static spv::Id emit_fixup_fdiv_sqrt(Converter::Impl &, const llvm::Con...
function emit_fixup_fdiv_sqrt (line 112) | static spv::Id emit_fixup_fdiv_sqrt(Converter::Impl &impl, const llvm:...
function peephole_trivial_arithmetic_identity (line 175) | static spv::Id peephole_trivial_arithmetic_identity(Converter::Impl &,
function peephole_trivial_arithmetic_identity (line 183) | static spv::Id peephole_trivial_arithmetic_identity(Converter::Impl &i...
function resolve_llvm_actual_value_type (line 238) | static spv::Id resolve_llvm_actual_value_type(Converter::Impl &impl,
function instruction_is_fast_math (line 256) | static bool instruction_is_fast_math(const llvm::BinaryOperator *op)
function instruction_is_fast_math (line 261) | static bool instruction_is_fast_math(const llvm::ConstantExpr *)
function instruction_is_undefined_value (line 267) | static bool instruction_is_undefined_value(const llvm::Value *value)
function can_optimize_to_snegate_inner (line 288) | bool can_optimize_to_snegate_inner(const T *instruction)
function can_optimize_to_snegate (line 299) | bool can_optimize_to_snegate(const llvm::BinaryOperator *instruction)
function can_optimize_to_snegate (line 304) | bool can_optimize_to_snegate(const llvm::ConstantExpr *instruction)
function constant_is_all_bits_set (line 309) | static bool constant_is_all_bits_set(llvm::Value *v)
function emit_binary_instruction_impl (line 344) | static spv::Id emit_binary_instruction_impl(Converter::Impl &impl, con...
function emit_binary_instruction (line 553) | bool emit_binary_instruction(Converter::Impl &impl, const llvm::Binary...
function emit_unary_instruction (line 558) | bool emit_unary_instruction(Converter::Impl &impl, const llvm::UnaryOp...
function emit_boolean_trunc_instruction (line 588) | static spv::Id emit_boolean_trunc_instruction(Converter::Impl &impl, c...
function emit_boolean_convert_instruction (line 619) | static spv::Id emit_boolean_convert_instruction(Converter::Impl &impl,...
function emit_masked_cast_instruction (line 686) | static spv::Id emit_masked_cast_instruction(Converter::Impl &impl, con...
function value_cast_is_noop (line 716) | static bool value_cast_is_noop(Converter::Impl &impl, const Instructio...
function value_cast_is_fp16_quantization (line 753) | static bool value_cast_is_fp16_quantization(Converter::Impl &impl, con...
function value_cast_is_fp16_quantization (line 773) | static bool value_cast_is_fp16_quantization(Converter::Impl &, const l...
function emit_dxbc_tgsm_bitcast (line 779) | static spv::Id emit_dxbc_tgsm_bitcast(Converter::Impl &impl, const Ins...
function emit_bypass_fp16_trunc (line 851) | spv::Id emit_bypass_fp16_trunc(Converter::Impl &impl, const llvm::Inst...
function emit_special_non_native_packing_bitcast (line 931) | static spv::Id emit_special_non_native_packing_bitcast(Converter::Impl...
function emit_bypass_fp16_trunc (line 1045) | static spv::Id emit_bypass_fp16_trunc(Converter::Impl &, const llvm::C...
function emit_special_non_native_packing_bitcast (line 1051) | static spv::Id emit_special_non_native_packing_bitcast(Converter::Impl...
function emit_cast_instruction_impl (line 1058) | static spv::Id emit_cast_instruction_impl(Converter::Impl &impl, const...
function cast_instruction_is_ignored (line 1294) | static bool cast_instruction_is_ignored(Converter::Impl &, const llvm:...
function emit_cast_instruction (line 1310) | bool emit_cast_instruction(Converter::Impl &impl, const llvm::CastInst...
function elementptr_is_nonuniform (line 1318) | static bool elementptr_is_nonuniform(const llvm::GetElementPtrInst *inst)
function elementptr_is_nonuniform (line 1323) | static bool elementptr_is_nonuniform(const llvm::ConstantExpr *)
function emit_getelementptr_resource (line 1329) | static bool emit_getelementptr_resource(Converter::Impl &impl, const I...
function build_constant_getelementptr (line 1354) | static spv::Id build_constant_getelementptr(Converter::Impl &impl, con...
function build_constant_cast (line 1395) | static spv::Id build_constant_cast(Converter::Impl &impl, const llvm::...
function build_constant_expression (line 1400) | spv::Id build_constant_expression(Converter::Impl &impl, const llvm::C...
type AllocaTrackedIndex (line 1452) | struct AllocaTrackedIndex
function AllocaTrackedIndex (line 1460) | static AllocaTrackedIndex gep_pointer_to_alloca_tracked_inst(Converter...
function get_dxbc_tgsm_gep_workaround (line 1475) | static void get_dxbc_tgsm_gep_workaround(Converter::Impl &impl, const ...
function emit_getelementptr_instruction (line 1493) | bool emit_getelementptr_instruction(Converter::Impl &impl, const llvm:...
function needs_group_shared_auto_barrier (line 1654) | static bool needs_group_shared_auto_barrier(Converter::Impl &impl, con...
function vkmm_requires_auto_visibility (line 1661) | static bool vkmm_requires_auto_visibility(Converter::Impl &impl, const...
function emit_load_instruction (line 1683) | bool emit_load_instruction(Converter::Impl &impl, const llvm::LoadInst...
function emit_store_instruction (line 1773) | bool emit_store_instruction(Converter::Impl &impl, const llvm::StoreIn...
function emit_compare_instruction (line 1840) | bool emit_compare_instruction(Converter::Impl &impl, const llvm::CmpIn...
function emit_extract_value_instruction (line 2010) | bool emit_extract_value_instruction(Converter::Impl &impl, const llvm:...
function emit_alloca_instruction (line 2040) | bool emit_alloca_instruction(Converter::Impl &impl, const llvm::Alloca...
function emit_peephole_findmsb (line 2085) | static bool emit_peephole_findmsb(Converter::Impl &impl, const llvm::I...
function emit_select_instruction (line 2149) | bool emit_select_instruction(Converter::Impl &impl, const llvm::Select...
function emit_cmpxchg_instruction (line 2164) | bool emit_cmpxchg_instruction(Converter::Impl &impl, const llvm::Atomi...
function emit_atomicrmw_instruction (line 2212) | bool emit_atomicrmw_instruction(Converter::Impl &impl, const llvm::Ato...
function emit_shufflevector_instruction (line 2284) | bool emit_shufflevector_instruction(Converter::Impl &impl, const llvm:...
function emit_extractelement_instruction (line 2299) | bool emit_extractelement_instruction(Converter::Impl &impl, const llvm...
function emit_insertelement_instruction (line 2322) | bool emit_insertelement_instruction(Converter::Impl &impl, const llvm:...
function analyze_getelementptr_instruction (line 2341) | bool analyze_getelementptr_instruction(Converter::Impl &impl, const ll...
function analyze_load_instruction (line 2360) | bool analyze_load_instruction(Converter::Impl &impl, const llvm::LoadI...
function analyze_alloca_store (line 2394) | static bool analyze_alloca_store(Converter::Impl &impl,
function register_ray_query_mapping (line 2480) | static void register_ray_query_mapping(Converter::Impl &impl, const ll...
function analyze_phi_instruction (line 2504) | bool analyze_phi_instruction(Converter::Impl &impl, const llvm::PHINod...
function analyze_store_instruction (line 2512) | bool analyze_store_instruction(Converter::Impl &impl, const llvm::Stor...
function analyze_atomicrmw_instruction (line 2541) | bool analyze_atomicrmw_instruction(Converter::Impl &impl, const llvm::...
function analyze_cmpxchg_instruction (line 2548) | bool analyze_cmpxchg_instruction(Converter::Impl &impl, const llvm::At...
function analyze_alloca_instruction (line 2555) | bool analyze_alloca_instruction(Converter::Impl &impl, const llvm::All...
function analyze_extractvalue_instruction (line 2589) | static void analyze_extractvalue_instruction(
function analyze_extractvalue_instruction (line 2646) | bool analyze_extractvalue_instruction(Converter::Impl &impl, const llv...
function analyze_compare_instruction (line 2653) | bool analyze_compare_instruction(Converter::Impl &impl, const llvm::Cm...
function can_optimize_conditional_branch_to_static (line 2687) | bool can_optimize_conditional_branch_to_static(
function emit_composite_construct_instruction (line 2746) | static bool emit_composite_construct_instruction(Converter::Impl &impl...
function emit_call_instruction (line 2756) | bool emit_call_instruction(Converter::Impl &impl, const llvm::CallInst...
function emit_llvm_instruction (line 2766) | bool emit_llvm_instruction(Converter::Impl &impl, const llvm::Instruct...
FILE: opcodes/opcodes_llvm_builtins.hpp
type dxil_spv (line 29) | namespace dxil_spv
FILE: roundtrip_shaders.py
function convert_spirv (line 36) | def convert_spirv(in_path, out_path, args, stage):
function convert_shaders (line 50) | def convert_shaders(args):
function main (line 82) | def main():
FILE: scratch_pool.hpp
type dxil_spv (line 30) | namespace dxil_spv
class ScratchPool (line 33) | class ScratchPool
method ScratchPool (line 36) | ScratchPool()
method T (line 42) | T *allocate(P &&... p)
method T (line 48) | T *allocate_raw()
type MallocDeleter (line 71) | struct MallocDeleter
type Block (line 79) | struct Block
FILE: shaders/ags/wmma_ags.h
type WaveMatrixOpDataFormat (line 28) | enum WaveMatrixOpDataFormat
type WaveMatrixOpMatrixType (line 43) | enum WaveMatrixOpMatrixType
type WaveMatrixOpMatrixShape (line 50) | enum WaveMatrixOpMatrixShape
type WaveMatrixOpcode (line 58) | enum WaveMatrixOpcode
type WaveMatrixRegType (line 102) | enum WaveMatrixRegType
type MatrixElementWiseOp (line 110) | enum MatrixElementWiseOp
type SparsityIndexMem (line 119) | enum SparsityIndexMem
type WMMA_Matrix (line 152) | struct WMMA_Matrix
function uint (line 157) | uint Code(uint opcode, uint opcodePhase, uint immediateData)
function uint (line 165) | uint AGSMagic(uint code, uint arg0, uint arg1)
function uint (line 172) | uint AGSMagic(uint opcode, uint phase, uint imm, uint arg0, uint arg1)
function uint (line 177) | uint MatrixIO(uint channel, uint reg, uint type)
function WMMA_Matrix (line 184) | WMMA_Matrix WMMA_MatMulAcc(WaveMatrixOpcode op, WMMA_Matrix A, WMMA_Matr...
type WMMA_Type (line 220) | struct WMMA_Type
function WMMA_Type (line 225) | WMMA_Type WMMA_MakeType(WaveMatrixOpDataFormat fmt, WaveMatrixOpMatrixTy...
function WMMA_Matrix (line 235) | WMMA_Matrix WMMA_Load(WMMA_Type type, ByteAddressBuffer BAB, uint offset...
function WMMA_Matrix (line 252) | WMMA_Matrix WMMA_Load(WMMA_Type type, RWByteAddressBuffer BAB, uint offs...
function WMMA_Store (line 269) | void WMMA_Store(WMMA_Type type, RWByteAddressBuffer BAB, uint offset, ui...
function WMMA_Matrix (line 282) | WMMA_Matrix WMMA_LoadLDS(WMMA_Type type, uint offset, uint stride)
function WMMA_StoreLDS (line 300) | void WMMA_StoreLDS(WMMA_Type type, uint offset, uint stride, WMMA_Matrix m)
function WMMA_Matrix (line 312) | WMMA_Matrix WMMA_Convert(WMMA_Type intype, WMMA_Type outtype, WMMA_Matri...
function WMMA_Matrix (line 332) | WMMA_Matrix WMMA_ConvertSaturate(WMMA_Type intype, WMMA_Type outtype, WM...
function uint (line 352) | uint WMMA_MatrixLength(WMMA_Type type)
function uint (line 357) | uint WMMA_MatrixElementExtract(WMMA_Type type, WMMA_Matrix m, uint elem)
function WMMA_Matrix (line 366) | WMMA_Matrix WMMA_MatrixElementFill(WMMA_Type type, WMMA_Matrix m, uint i...
function WMMA_Matrix (line 385) | WMMA_Matrix WMMA_MatrixFill(WMMA_Type type, uint value)
FILE: shaders/nvapi/nvHLSLExtns.h
function NvShfl (line 53) | int NvShfl(int val, uint srcLane, int width = NV_WARP_SIZE)
function int2 (line 65) | int2 NvShfl(int2 val, uint srcLane, int width = NV_WARP_SIZE)
function int4 (line 72) | int4 NvShfl(int4 val, uint srcLane, int width = NV_WARP_SIZE)
function NvShflUp (line 84) | int NvShflUp(int val, uint delta, int width = NV_WARP_SIZE)
function NvShflDown (line 97) | int NvShflDown(int val, uint delta, int width = NV_WARP_SIZE)
function NvShflXor (line 110) | int NvShflXor(int val, uint laneMask, int width = NV_WARP_SIZE)
function uint (line 126) | uint NvAny(int predicate)
function uint (line 135) | uint NvAll(int predicate)
function uint (line 144) | uint NvBallot(int predicate)
function NvGetLaneId (line 158) | int NvGetLaneId()
function uint (line 166) | uint NvGetSpecial(uint subOpCode)
function uint (line 180) | uint NvInterlockedAddFp16x2(RWByteAddressBuffer uav, uint byteAddress, u...
function uint (line 185) | uint NvInterlockedMinFp16x2(RWByteAddressBuffer uav, uint byteAddress, u...
function uint (line 190) | uint NvInterlockedMaxFp16x2(RWByteAddressBuffer uav, uint byteAddress, u...
function uint (line 197) | uint NvInterlockedAddFp16x2(RWByteAddressBuffer uav, uint byteAddress, f...
function uint (line 202) | uint NvInterlockedMinFp16x2(RWByteAddressBuffer uav, uint byteAddress, f...
function uint (line 207) | uint NvInterlockedMaxFp16x2(RWByteAddressBuffer uav, uint byteAddress, f...
function uint (line 221) | uint NvInterlockedAddFp16x2(RWTexture1D<float2> uav, uint address, uint ...
function uint (line 226) | uint NvInterlockedMinFp16x2(RWTexture1D<float2> uav, uint address, uint ...
function uint (line 231) | uint NvInterlockedMaxFp16x2(RWTexture1D<float2> uav, uint address, uint ...
function uint (line 236) | uint NvInterlockedAddFp16x2(RWTexture2D<float2> uav, uint2 address, uint...
function uint (line 241) | uint NvInterlockedMinFp16x2(RWTexture2D<float2> uav, uint2 address, uint...
function uint (line 246) | uint NvInterlockedMaxFp16x2(RWTexture2D<float2> uav, uint2 address, uint...
function uint (line 251) | uint NvInterlockedAddFp16x2(RWTexture3D<float2> uav, uint3 address, uint...
function uint (line 256) | uint NvInterlockedMinFp16x2(RWTexture3D<float2> uav, uint3 address, uint...
function uint (line 261) | uint NvInterlockedMaxFp16x2(RWTexture3D<float2> uav, uint3 address, uint...
function uint (line 268) | uint NvInterlockedAddFp16x2(RWTexture1D<float2> uav, uint address, float...
function uint (line 273) | uint NvInterlockedMinFp16x2(RWTexture1D<float2> uav, uint address, float...
function uint (line 278) | uint NvInterlockedMaxFp16x2(RWTexture1D<float2> uav, uint address, float...
function uint (line 283) | uint NvInterlockedAddFp16x2(RWTexture2D<float2> uav, uint2 address, floa...
function uint (line 288) | uint NvInterlockedMinFp16x2(RWTexture2D<float2> uav, uint2 address, floa...
function uint (line 293) | uint NvInterlockedMaxFp16x2(RWTexture2D<float2> uav, uint2 address, floa...
function uint (line 298) | uint NvInterlockedAddFp16x2(RWTexture3D<float2> uav, uint3 address, floa...
function uint (line 303) | uint NvInterlockedMinFp16x2(RWTexture3D<float2> uav, uint3 address, floa...
function uint (line 308) | uint NvInterlockedMaxFp16x2(RWTexture3D<float2> uav, uint3 address, floa...
function uint2 (line 323) | uint2 NvInterlockedAddFp16x4(RWTexture1D<float4> uav, uint address, uint...
function uint2 (line 328) | uint2 NvInterlockedMinFp16x4(RWTexture1D<float4> uav, uint address, uint...
function uint2 (line 333) | uint2 NvInterlockedMaxFp16x4(RWTexture1D<float4> uav, uint address, uint...
function uint2 (line 338) | uint2 NvInterlockedAddFp16x4(RWTexture2D<float4> uav, uint2 address, uin...
function uint2 (line 343) | uint2 NvInterlockedMinFp16x4(RWTexture2D<float4> uav, uint2 address, uin...
function uint2 (line 348) | uint2 NvInterlockedMaxFp16x4(RWTexture2D<float4> uav, uint2 address, uin...
function uint2 (line 353) | uint2 NvInterlockedAddFp16x4(RWTexture3D<float4> uav, uint3 address, uin...
function uint2 (line 358) | uint2 NvInterlockedMinFp16x4(RWTexture3D<float4> uav, uint3 address, uin...
function uint2 (line 363) | uint2 NvInterlockedMaxFp16x4(RWTexture3D<float4> uav, uint3 address, uin...
function uint2 (line 369) | uint2 NvInterlockedAddFp16x4(RWTexture1D<float4> uav, uint address, floa...
function uint2 (line 374) | uint2 NvInterlockedMinFp16x4(RWTexture1D<float4> uav, uint address, floa...
function uint2 (line 379) | uint2 NvInterlockedMaxFp16x4(RWTexture1D<float4> uav, uint address, floa...
function uint2 (line 384) | uint2 NvInterlockedAddFp16x4(RWTexture2D<float4> uav, uint2 address, flo...
function uint2 (line 389) | uint2 NvInterlockedMinFp16x4(RWTexture2D<float4> uav, uint2 address, flo...
function uint2 (line 394) | uint2 NvInterlockedMaxFp16x4(RWTexture2D<float4> uav, uint2 address, flo...
function uint2 (line 399) | uint2 NvInterlockedAddFp16x4(RWTexture3D<float4> uav, uint3 address, flo...
function uint2 (line 404) | uint2 NvInterlockedMinFp16x4(RWTexture3D<float4> uav, uint3 address, flo...
function uint2 (line 409) | uint2 NvInterlockedMaxFp16x4(RWTexture3D<float4> uav, uint3 address, flo...
function NvInterlockedAddFp32 (line 423) | float NvInterlockedAddFp32(RWByteAddressBuffer uav, uint byteAddress, fl...
function NvInterlockedAddFp32 (line 435) | float NvInterlockedAddFp32(RWTexture1D<float> uav, uint address, float val)
function NvInterlockedAddFp32 (line 440) | float NvInterlockedAddFp32(RWTexture2D<float> uav, uint2 address, float ...
function NvInterlockedAddFp32 (line 445) | float NvInterlockedAddFp32(RWTexture3D<float> uav, uint3 address, float ...
function uint2 (line 460) | uint2 NvInterlockedAddUint64(RWByteAddressBuffer uav, uint byteAddress, ...
function uint2 (line 465) | uint2 NvInterlockedMaxUint64(RWByteAddressBuffer uav, uint byteAddress, ...
function uint2 (line 470) | uint2 NvInterlockedMinUint64(RWByteAddressBuffer uav, uint byteAddress, ...
function uint2 (line 475) | uint2 NvInterlockedAndUint64(RWByteAddressBuffer uav, uint byteAddress, ...
function uint2 (line 480) | uint2 NvInterlockedOrUint64(RWByteAddressBuffer uav, uint byteAddress, u...
function uint2 (line 485) | uint2 NvInterlockedXorUint64(RWByteAddressBuffer uav, uint byteAddress, ...
function uint2 (line 490) | uint2 NvInterlockedCompareExchangeUint64(RWByteAddressBuffer uav, uint b...
function uint2 (line 495) | uint2 NvInterlockedExchangeUint64(RWByteAddressBuffer uav, uint byteAddr...
function uint2 (line 507) | uint2 NvInterlockedAddUint64(RWTexture1D<uint2> uav, uint address, uint2...
function uint2 (line 512) | uint2 NvInterlockedMaxUint64(RWTexture1D<uint2> uav, uint address, uint2...
function uint2 (line 517) | uint2 NvInterlockedMinUint64(RWTexture1D<uint2> uav, uint address, uint2...
function uint2 (line 522) | uint2 NvInterlockedAndUint64(RWTexture1D<uint2> uav, uint address, uint2...
function uint2 (line 527) | uint2 NvInterlockedOrUint64(RWTexture1D<uint2> uav, uint address, uint2 ...
function uint2 (line 532) | uint2 NvInterlockedXorUint64(RWTexture1D<uint2> uav, uint address, uint2...
function uint2 (line 537) | uint2 NvInterlockedCompareExchangeUint64(RWTexture1D<uint2> uav, uint ad...
function uint2 (line 542) | uint2 NvInterlockedExchangeUint64(RWTexture1D<uint2> uav, uint address, ...
function uint2 (line 547) | uint2 NvInterlockedAddUint64(RWTexture2D<uint2> uav, uint2 address, uint...
function uint2 (line 552) | uint2 NvInterlockedMaxUint64(RWTexture2D<uint2> uav, uint2 address, uint...
function uint2 (line 557) | uint2 NvInterlockedMinUint64(RWTexture2D<uint2> uav, uint2 address, uint...
function uint2 (line 562) | uint2 NvInterlockedAndUint64(RWTexture2D<uint2> uav, uint2 address, uint...
function uint2 (line 567) | uint2 NvInterlockedOrUint64(RWTexture2D<uint2> uav, uint2 address, uint2...
function uint2 (line 572) | uint2 NvInterlockedXorUint64(RWTexture2D<uint2> uav, uint2 address, uint...
function uint2 (line 577) | uint2 NvInterlockedCompareExchangeUint64(RWTexture2D<uint2> uav, uint2 a...
function uint2 (line 582) | uint2 NvInterlockedExchangeUint64(RWTexture2D<uint2> uav, uint2 address,...
function uint2 (line 587) | uint2 NvInterlockedAddUint64(RWTexture3D<uint2> uav, uint3 address, uint...
function uint2 (line 592) | uint2 NvInterlockedMaxUint64(RWTexture3D<uint2> uav, uint3 address, uint...
function uint2 (line 597) | uint2 NvInterlockedMinUint64(RWTexture3D<uint2> uav, uint3 address, uint...
function uint2 (line 602) | uint2 NvInterlockedAndUint64(RWTexture3D<uint2> uav, uint3 address, uint...
function uint2 (line 607) | uint2 NvInterlockedOrUint64(RWTexture3D<uint2> uav, uint3 address, uint2...
function uint2 (line 612) | uint2 NvInterlockedXorUint64(RWTexture3D<uint2> uav, uint3 address, uint...
function uint2 (line 617) | uint2 NvInterlockedCompareExchangeUint64(RWTexture3D<uint2> uav, uint3 a...
function uint2 (line 622) | uint2 NvInterlockedExchangeUint64(RWTexture3D<uint2> uav, uint3 address,...
function uint3 (line 632) | uint3 NvGetShadingRate()
function NvEvaluateAttributeAtSampleForVPRS (line 644) | float NvEvaluateAttributeAtSampleForVPRS(float attrib, uint sampleIndex,...
function float2 (line 657) | float2 NvEvaluateAttributeAtSampleForVPRS(float2 attrib, uint sampleInde...
function float3 (line 671) | float3 NvEvaluateAttributeAtSampleForVPRS(float3 attrib, uint sampleInde...
function float4 (line 686) | float4 NvEvaluateAttributeAtSampleForVPRS(float4 attrib, uint sampleInde...
function NvEvaluateAttributeAtSampleForVPRS (line 702) | int NvEvaluateAttributeAtSampleForVPRS(int attrib, uint sampleIndex, int...
function int2 (line 715) | int2 NvEvaluateAttributeAtSampleForVPRS(int2 attrib, uint sampleIndex, i...
function int3 (line 729) | int3 NvEvaluateAttributeAtSampleForVPRS(int3 attrib, uint sampleIndex, i...
function int4 (line 744) | int4 NvEvaluateAttributeAtSampleForVPRS(int4 attrib, uint sampleIndex, i...
function uint (line 760) | uint NvEvaluateAttributeAtSampleForVPRS(uint attrib, uint sampleIndex, i...
function uint2 (line 773) | uint2 NvEvaluateAttributeAtSampleForVPRS(uint2 attrib, uint sampleIndex,...
function uint3 (line 787) | uint3 NvEvaluateAttributeAtSampleForVPRS(uint3 attrib, uint sampleIndex,...
function uint4 (line 802) | uint4 NvEvaluateAttributeAtSampleForVPRS(uint4 attrib, uint sampleIndex,...
function NvEvaluateAttributeSnappedForVPRS (line 819) | float NvEvaluateAttributeSnappedForVPRS(float attrib, uint2 offset)
function float2 (line 831) | float2 NvEvaluateAttributeSnappedForVPRS(float2 attrib, uint2 offset)
function float3 (line 844) | float3 NvEvaluateAttributeSnappedForVPRS(float3 attrib, uint2 offset)
function float4 (line 858) | float4 NvEvaluateAttributeSnappedForVPRS(float4 attrib, uint2 offset)
function NvEvaluateAttributeSnappedForVPRS (line 873) | int NvEvaluateAttributeSnappedForVPRS(int attrib, uint2 offset)
function int2 (line 885) | int2 NvEvaluateAttributeSnappedForVPRS(int2 attrib, uint2 offset)
function int3 (line 898) | int3 NvEvaluateAttributeSnappedForVPRS(int3 attrib, uint2 offset)
function int4 (line 912) | int4 NvEvaluateAttributeSnappedForVPRS(int4 attrib, uint2 offset)
function uint (line 927) | uint NvEvaluateAttributeSnappedForVPRS(uint attrib, uint2 offset)
function uint2 (line 939) | uint2 NvEvaluateAttributeSnappedForVPRS(uint2 attrib, uint2 offset)
function uint3 (line 952) | uint3 NvEvaluateAttributeSnappedForVPRS(uint3 attrib, uint2 offset)
function uint4 (line 966) | uint4 NvEvaluateAttributeSnappedForVPRS(uint4 attrib, uint2 offset)
function uint (line 982) | uint NvWaveMatch(uint value)
function uint (line 992) | uint NvWaveMatch(uint2 value)
function uint (line 1002) | uint NvWaveMatch(uint4 value)
function uint (line 1012) | uint NvWaveMatch(float value)
function uint (line 1022) | uint NvWaveMatch(float2 value)
function uint (line 1032) | uint NvWaveMatch(float4 value)
function uint (line 1098) | uint NvFootprintExtractLOD(uint4 blob)
function uint (line 1103) | uint NvFootprintExtractReturnGran(uint4 blob)
function uint2 (line 1108) | uint2 NvFootprintExtractAnchorTileLoc2D(uint4 blob)
function uint3 (line 1116) | uint3 NvFootprintExtractAnchorTileLoc3D(uint4 blob)
function uint2 (line 1125) | uint2 NvFootprintExtractOffset2D(uint4 blob)
function uint3 (line 1133) | uint3 NvFootprintExtractOffset3D(uint4 blob)
function uint2 (line 1142) | uint2 NvFootprintExtractBitmask(uint4 blob)
function uint (line 1213) | uint NvActiveThreads()
function uint (line 1237) | uint NvWaveMultiPrefixInclusiveAdd(uint val, uint mask)
function uint (line 1260) | uint NvWaveMultiPrefixExclusiveAdd(uint val, uint mask)
function uint2 (line 1271) | uint2 NvWaveMultiPrefixInclusiveAdd(uint2 val, uint mask)
function uint2 (line 1291) | uint2 NvWaveMultiPrefixExclusiveAdd(uint2 val, uint mask)
function uint4 (line 1302) | uint4 NvWaveMultiPrefixInclusiveAdd(uint4 val, uint mask)
function uint4 (line 1322) | uint4 NvWaveMultiPrefixExclusiveAdd(uint4 val, uint mask)
function uint (line 1334) | uint NvWaveMultiPrefixInclusiveAnd(uint val, uint mask)
function uint (line 1354) | uint NvWaveMultiPrefixExclusiveAnd(uint val, uint mask)
function uint2 (line 1365) | uint2 NvWaveMultiPrefixInclusiveAnd(uint2 val, uint mask)
function uint2 (line 1385) | uint2 NvWaveMultiPrefixExclusiveAnd(uint2 val, uint mask)
function uint4 (line 1397) | uint4 NvWaveMultiPrefixInclusiveAnd(uint4 val, uint mask)
function uint4 (line 1417) | uint4 NvWaveMultiPrefixExclusiveAnd(uint4 val, uint mask)
function uint (line 1430) | uint NvWaveMultiPrefixInclusiveOr(uint val, uint mask)
function uint (line 1450) | uint NvWaveMultiPrefixExclusiveOr(uint val, uint mask)
function uint2 (line 1461) | uint2 NvWaveMultiPrefixInclusiveOr(uint2 val, uint mask)
function uint2 (line 1481) | uint2 NvWaveMultiPrefixExclusiveOr(uint2 val, uint mask)
function uint4 (line 1493) | uint4 NvWaveMultiPrefixInclusiveOr(uint4 val, uint mask)
function uint4 (line 1513) | uint4 NvWaveMultiPrefixExclusiveOr(uint4 val, uint mask)
function uint (line 1526) | uint NvWaveMultiPrefixInclusiveXOr(uint val, uint mask)
function uint (line 1546) | uint NvWaveMultiPrefixExclusiveXOr(uint val, uint mask)
function uint2 (line 1557) | uint2 NvWaveMultiPrefixInclusiveXOr(uint2 val, uint mask)
function uint2 (line 1577) | uint2 NvWaveMultiPrefixExclusiveXOr(uint2 val, uint mask)
function uint4 (line 1589) | uint4 NvWaveMultiPrefixInclusiveXOr(uint4 val, uint mask)
function uint4 (line 1609) | uint4 NvWaveMultiPrefixExclusiveXOr(uint4 val, uint mask)
function float3x3 (line 1625) | float3x3 NvRtTriangleObjectPositions()
function float3x3 (line 1643) | float3x3 NvRtMicroTriangleObjectPositions()
function float3x2 (line 1661) | float3x2 NvRtMicroTriangleBarycentrics()
function NvRtIsMicroTriangleHit (line 1676) | bool NvRtIsMicroTriangleHit()
function NvRtIsBackFacing (line 1684) | bool NvRtIsBackFacing()
function float3 (line 1694) | float3 NvRtMicroVertexObjectPosition(RaytracingAccelerationStructure Acc...
function float2 (line 1715) | float2 NvRtMicroVertexBarycentrics(RaytracingAccelerationStructure Accel...
function uint (line 1743) | uint NvRtGetClusterID()
function float4 (line 1770) | float4 NvRtSphereObjectPositionAndRadius()
function float2x4 (line 1783) | float2x4 NvRtLssObjectPositionsAndRadii()
function NvRtIsSphereHit (line 1800) | bool NvRtIsSphereHit()
function NvRtIsLssHit (line 1808) | bool NvRtIsLssHit()
function IsHit (line 1854) | struct NvHitObject {
function IsNop (line 1875) | bool IsNop()
function uint (line 1884) | uint GetInstanceID()
function uint (line 1892) | uint GetInstanceIndex()
function uint (line 1900) | uint GetPrimitiveIndex()
function uint (line 1908) | uint GetGeometryIndex()
function uint (line 1916) | uint GetHitKind()
function RayDesc (line 1924) | RayDesc GetRayDesc()
function uint (line 1965) | uint GetShaderTableIndex()
function uint (line 1973) | uint LoadLocalRootTableConstant(uint RootConstantOffsetInBytes)
function float4 (line 1982) | float4 GetSphereObjectPositionAndRadius()
function float2x4 (line 1996) | float2x4 GetLssObjectPositionsAndRadii()
function IsSphereHit (line 2014) | bool IsSphereHit()
function IsLssHit (line 2023) | bool IsLssHit()
function uint (line 2032) | uint GetClusterID()
function float3x3 (line 2040) | float3x3 GetTriangleObjectPositions()
type AttrWrapper (line 2109) | struct AttrWrapper { T Attrs; }
type DummyPayload (line 2114) | struct DummyPayload { int a; }
type AttrWrapper (line 2145) | struct AttrWrapper { T Attrs; }
type DummyPayload (line 2150) | struct DummyPayload { int a; }
function NvHitObject (line 2159) | NvHitObject NvMakeMiss(
function NvHitObject (line 2181) | NvHitObject NvMakeNop()
function NvReorderThread (line 2192) | void NvReorderThread(uint CoherenceHint, uint NumCoherenceHintBits)
function NvReorderThread (line 2203) | void NvReorderThread(NvHitObject HitObj, uint CoherenceHint, uint NumCoh...
function NvReorderThread (line 2214) | void NvReorderThread(NvHitObject HitObj)
function IsHit (line 2237) | struct NvHitObject {
function IsNop (line 2258) | bool IsNop()
function uint (line 2267) | uint GetInstanceID()
function uint (line 2275) | uint GetInstanceIndex()
function uint (line 2283) | uint GetPrimitiveIndex()
function uint (line 2291) | uint GetGeometryIndex()
function uint (line 2299) | uint GetHitKind()
function RayDesc (line 2307) | RayDesc GetRayDesc()
function uint (line 2335) | uint GetShaderTableIndex()
function uint (line 2343) | uint LoadLocalRootTableConstant(uint RootConstantOffsetInBytes)
function float4 (line 2352) | float4 GetSphereObjectPositionAndRadius()
function float2x4 (line 2366) | float2x4 GetLssObjectPositionsAndRadii()
function IsSphereHit (line 2384) | bool IsSphereHit()
function IsLssHit (line 2393) | bool IsLssHit()
function uint (line 2402) | uint GetClusterID()
function float3x3 (line 2410) | float3x3 GetTriangleObjectPositions()
type NvHitObjectMacroDummyPayloadType (line 2448) | struct NvHitObjectMacroDummyPayloadType { int a; }
function NvHitObject (line 2500) | NvHitObject NvMakeMiss(
function NvHitObject (line 2522) | NvHitObject NvMakeNop()
function NvReorderThread (line 2542) | void NvReorderThread(uint CoherenceHint, uint NumCoherenceHintBits)
function NvReorderThread (line 2553) | void NvReorderThread(NvHitObject HitObj, uint CoherenceHint, uint NumCoh...
function NvReorderThread (line 2564) | void NvReorderThread(NvHitObject HitObj)
FILE: shaders/nvapi/nvHLSLExtnsInternal.h
type NvShaderExtnStruct (line 32) | struct NvShaderExtnStruct
function __NvGetShflMaskFromWidth (line 80) | int __NvGetShflMaskFromWidth(uint width)
function __NvReferenceUAVForOp (line 87) | void __NvReferenceUAVForOp(RWByteAddressBuffer uav)
function __NvReferenceUAVForOp (line 94) | void __NvReferenceUAVForOp(RWTexture1D<float2> uav)
function __NvReferenceUAVForOp (line 101) | void __NvReferenceUAVForOp(RWTexture2D<float2> uav)
function __NvReferenceUAVForOp (line 108) | void __NvReferenceUAVForOp(RWTexture3D<float2> uav)
function __NvReferenceUAVForOp (line 115) | void __NvReferenceUAVForOp(RWTexture1D<float4> uav)
function __NvReferenceUAVForOp (line 122) | void __NvReferenceUAVForOp(RWTexture2D<float4> uav)
function __NvReferenceUAVForOp (line 129) | void __NvReferenceUAVForOp(RWTexture3D<float4> uav)
function __NvReferenceUAVForOp (line 136) | void __NvReferenceUAVForOp(RWTexture1D<float> uav)
function __NvReferenceUAVForOp (line 143) | void __NvReferenceUAVForOp(RWTexture2D<float> uav)
function __NvReferenceUAVForOp (line 150) | void __NvReferenceUAVForOp(RWTexture3D<float> uav)
function __NvReferenceUAVForOp (line 158) | void __NvReferenceUAVForOp(RWTexture1D<uint2> uav)
function __NvReferenceUAVForOp (line 165) | void __NvReferenceUAVForOp(RWTexture2D<uint2> uav)
function __NvReferenceUAVForOp (line 172) | void __NvReferenceUAVForOp(RWTexture3D<uint2> uav)
function __NvReferenceUAVForOp (line 179) | void __NvReferenceUAVForOp(RWTexture1D<uint4> uav)
function __NvReferenceUAVForOp (line 186) | void __NvReferenceUAVForOp(RWTexture2D<uint4> uav)
function __NvReferenceUAVForOp (line 193) | void __NvReferenceUAVForOp(RWTexture3D<uint4> uav)
function __NvReferenceUAVForOp (line 200) | void __NvReferenceUAVForOp(RWTexture1D<uint> uav)
function __NvReferenceUAVForOp (line 207) | void __NvReferenceUAVForOp(RWTexture2D<uint> uav)
function __NvReferenceUAVForOp (line 214) | void __NvReferenceUAVForOp(RWTexture3D<uint> uav)
function __NvReferenceUAVForOp (line 221) | void __NvReferenceUAVForOp(RWTexture1D<int2> uav)
function __NvReferenceUAVForOp (line 228) | void __NvReferenceUAVForOp(RWTexture2D<int2> uav)
function __NvReferenceUAVForOp (line 235) | void __NvReferenceUAVForOp(RWTexture3D<int2> uav)
function __NvReferenceUAVForOp (line 242) | void __NvReferenceUAVForOp(RWTexture1D<int4> uav)
function __NvReferenceUAVForOp (line 249) | void __NvReferenceUAVForOp(RWTexture2D<int4> uav)
function __NvReferenceUAVForOp (line 256) | void __NvReferenceUAVForOp(RWTexture3D<int4> uav)
function __NvReferenceUAVForOp (line 263) | void __NvReferenceUAVForOp(RWTexture1D<int> uav)
function __NvReferenceUAVForOp (line 270) | void __NvReferenceUAVForOp(RWTexture2D<int> uav)
function __NvReferenceUAVForOp (line 277) | void __NvReferenceUAVForOp(RWTexture3D<int> uav)
function uint (line 304) | uint __NvAtomicOpFP16x2(RWByteAddressBuffer uav, uint byteAddress, uint ...
function uint (line 325) | uint __NvAtomicOpFP16x2(RWTexture1D<float2> uav, uint address, uint fp16...
function uint (line 337) | uint __NvAtomicOpFP16x2(RWTexture2D<float2> uav, uint2 address, uint fp1...
function uint (line 349) | uint __NvAtomicOpFP16x2(RWTexture3D<float2> uav, uint3 address, uint fp1...
function uint2 (line 371) | uint2 __NvAtomicOpFP16x2(RWTexture1D<float4> uav, uint address, uint2 fp...
function uint2 (line 397) | uint2 __NvAtomicOpFP16x2(RWTexture2D<float4> uav, uint2 address, uint2 f...
function uint2 (line 425) | uint2 __NvAtomicOpFP16x2(RWTexture3D<float4> uav, uint3 address, uint2 f...
function uint (line 453) | uint __fp32x2Tofp16x2(float2 val)
function uint2 (line 458) | uint2 __fp32x4Tofp16x4(float4 val)
function __NvAtomicAddFP32 (line 469) | float __NvAtomicAddFP32(RWByteAddressBuffer uav, uint byteAddress, float...
function __NvAtomicAddFP32 (line 481) | float __NvAtomicAddFP32(RWTexture1D<float> uav, uint address, float val)
function __NvAtomicAddFP32 (line 493) | float __NvAtomicAddFP32(RWTexture2D<float> uav, uint2 address, float val)
function __NvAtomicAddFP32 (line 505) | float __NvAtomicAddFP32(RWTexture3D<float> uav, uint3 address, float val)
function uint2 (line 525) | uint2 __NvAtomicCompareExchangeUINT64(RWByteAddressBuffer uav, uint byte...
function uint2 (line 539) | uint2 __NvAtomicOpUINT64(RWByteAddressBuffer uav, uint byteAddress, uint...
function uint2 (line 552) | uint2 __NvAtomicCompareExchangeUINT64(RWTexture1D<uint2> uav, uint addre...
function uint2 (line 566) | uint2 __NvAtomicOpUINT64(RWTexture1D<uint2> uav, uint address, uint2 val...
function uint2 (line 579) | uint2 __NvAtomicCompareExchangeUINT64(RWTexture2D<uint2> uav, uint2 addr...
function uint2 (line 593) | uint2 __NvAtomicOpUINT64(RWTexture2D<uint2> uav, uint2 address, uint2 va...
function uint2 (line 606) | uint2 __NvAtomicCompareExchangeUINT64(RWTexture3D<uint2> uav, uint3 addr...
function uint2 (line 620) | uint2 __NvAtomicOpUINT64(RWTexture3D<uint2> uav, uint3 address, uint2 va...
function uint (line 738) | uint __NvGetSpecial(uint subOpCode)
function __NvShflGeneric (line 747) | int __NvShflGeneric(int val, uint srcLane, uint maskClampVal, out uint l...
function uint (line 766) | uint __NvRtGetCandidateClusterID(uint rqFlags)
function uint (line 774) | uint __NvRtGetCommittedClusterID(uint rqFlags)
function float3x3 (line 782) | float3x3 __NvRtCandidateTriangleObjectPositions(uint rqFlags)
function float3x3 (line 801) | float3x3 __NvRtCommittedTriangleObjectPositions(uint rqFlags)
function __NvRtCandidateIsNonOpaqueSphere (line 820) | bool __NvRtCandidateIsNonOpaqueSphere(uint rqFlags)
function __NvRtCandidateIsNonOpaqueLss (line 829) | bool __NvRtCandidateIsNonOpaqueLss(uint rqFlags)
function __NvRtCandidateLssHitParameter (line 838) | float __NvRtCandidateLssHitParameter(uint rqFlags)
function float4 (line 847) | float4 __NvRtCandidateSphereObjectPositionAndRadius(uint rqFlags)
function float2x4 (line 861) | float2x4 __NvRtCandidateLssObjectPositionsAndRadii(uint rqFlags)
function __NvRtCandidateBuiltinPrimitiveRayT (line 879) | float __NvRtCandidateBuiltinPrimitiveRayT(uint rqFlags)
function __NvRtCommittedIsSphere (line 888) | bool __NvRtCommittedIsSphere(uint rqFlags)
function __NvRtCommittedIsLss (line 897) | bool __NvRtCommittedIsLss(uint rqFlags)
function __NvRtCommittedLssHitParameter (line 906) | float __NvRtCommittedLssHitParameter(uint rqFlags)
function float4 (line 915) | float4 __NvRtCommittedSphereObjectPositionAndRadius(uint rqFlags)
function float2x4 (line 929) | float2x4 __NvRtCommittedLssObjectPositionsAndRadii(uint rqFlags)
function __NvRtCommitNonOpaqueBuiltinPrimitiveHit (line 947) | void __NvRtCommitNonOpaqueBuiltinPrimitiveHit(uint rqFlags)
FILE: shaders/vkmm/wmma_ags.h
type WaveMatrixOpDataFormat (line 28) | enum WaveMatrixOpDataFormat
type WaveMatrixOpMatrixType (line 43) | enum WaveMatrixOpMatrixType
type WaveMatrixOpMatrixShape (line 50) | enum WaveMatrixOpMatrixShape
type WaveMatrixOpcode (line 58) | enum WaveMatrixOpcode
type WaveMatrixRegType (line 102) | enum WaveMatrixRegType
type MatrixElementWiseOp (line 110) | enum MatrixElementWiseOp
type SparsityIndexMem (line 119) | enum SparsityIndexMem
type WMMA_Matrix (line 152) | struct WMMA_Matrix
function uint (line 157) | uint Code(uint opcode, uint opcodePhase, uint immediateData)
function uint (line 165) | uint AGSMagic(uint code, uint arg0, uint arg1)
function uint (line 172) | uint AGSMagic(uint opcode, uint phase, uint imm, uint arg0, uint arg1)
function uint (line 177) | uint MatrixIO(uint channel, uint reg, uint type)
function WMMA_Matrix (line 184) | WMMA_Matrix WMMA_MatMulAcc(WaveMatrixOpcode op, WMMA_Matrix A, WMMA_Matr...
type WMMA_Type (line 220) | struct WMMA_Type
function WMMA_Type (line 225) | WMMA_Type WMMA_MakeType(WaveMatrixOpDataFormat fmt, WaveMatrixOpMatrixTy...
function WMMA_Matrix (line 235) | WMMA_Matrix WMMA_Load(WMMA_Type type, ByteAddressBuffer BAB, uint offset...
function WMMA_Matrix (line 252) | WMMA_Matrix WMMA_Load(WMMA_Type type, RWByteAddressBuffer BAB, uint offs...
function WMMA_Store (line 269) | void WMMA_Store(WMMA_Type type, RWByteAddressBuffer BAB, uint offset, ui...
function WMMA_Matrix (line 282) | WMMA_Matrix WMMA_LoadLDS(WMMA_Type type, uint offset, uint stride)
function WMMA_StoreLDS (line 300) | void WMMA_StoreLDS(WMMA_Type type, uint offset, uint stride, WMMA_Matrix m)
function WMMA_Matrix (line 312) | WMMA_Matrix WMMA_Convert(WMMA_Type intype, WMMA_Type outtype, WMMA_Matri...
function uint (line 332) | uint WMMA_MatrixLength(WMMA_Type type)
function uint (line 337) | uint WMMA_MatrixElementExtract(WMMA_Type type, WMMA_Matrix m, uint elem)
function WMMA_Matrix (line 346) | WMMA_Matrix WMMA_MatrixElementFill(WMMA_Type type, WMMA_Matrix m, uint i...
function WMMA_Matrix (line 365) | WMMA_Matrix WMMA_MatrixFill(WMMA_Type type, uint value)
FILE: show_graph.py
function main (line 6) | def main():
FILE: spirv_module.cpp
type dxil_spv (line 35) | namespace dxil_spv
type SPIRVModule::Impl (line 38) | struct SPIRVModule::Impl : BlockEmissionInterface
method Impl (line 40) | explicit Impl(SPIRVModule &module)
type MultiPrefixOp (line 157) | struct MultiPrefixOp
type CBVOp (line 165) | struct CBVOp
type CoopMatConvOp (line 174) | struct CoopMatConvOp
function make_i16vec2_constant (line 2486) | static spv::Id make_i16vec2_constant(spv::Builder &builder, int16_t val)
function make_u16vec2_constant (line 2493) | static spv::Id make_u16vec2_constant(spv::Builder &builder, uint16_t val)
function Operation (line 3764) | Operation *SPIRVModule::allocate_op()
function Operation (line 3769) | Operation *SPIRVModule::allocate_op(spv::Op op)
function Operation (line 3774) | Operation *SPIRVModule::allocate_op(spv::Op op, spv::Id id, spv::Id ty...
function DescriptorQAInfo (line 3815) | const DescriptorQAInfo &SPIRVModule::get_descriptor_qa_info() const
FILE: spirv_module.hpp
type spv (line 33) | namespace spv
class Function (line 35) | class Function
class Builder (line 36) | class Builder
class Instruction (line 37) | class Instruction
type dxil_spv (line 45) | namespace dxil_spv
type CFGNode (line 47) | struct CFGNode
class CFGNodePool (line 48) | class CFGNodePool
type HelperCall (line 50) | enum class HelperCall
type BDAOperation (line 89) | enum class BDAOperation
class SPIRVModule (line 97) | class SPIRVModule
FILE: spirv_module_instrumentation.cpp
type dxil_spv (line 29) | namespace dxil_spv
function build_instrumentation_ssbo (line 31) | static spv::Id build_instrumentation_ssbo(SPIRVModule &module, spv::Id...
function build_u64_add_u32 (line 50) | static spv::Id build_u64_add_u32(spv::Builder &builder, spv::Id a, spv...
function build_byte_mask (line 85) | static spv::Id build_byte_mask(spv::Builder &builder, spv::Id addr_lo_...
function build_word_mask (line 106) | static spv::Id build_word_mask(spv::Builder &builder, spv::Id addr_lo_...
function build_hash_call (line 145) | static spv::Id build_hash_call(SPIRVModule &module)
function build_hash_mask (line 222) | static spv::Id build_hash_mask(spv::Builder &builder, spv::Id var_id)
function build_hash_offset (line 244) | static spv::Id build_hash_offset(spv::Builder &builder, spv::Id var_id)
function build_get_invalidation_mask (line 270) | static spv::Id build_get_invalidation_mask(spv::Builder &builder, spv:...
function build_takes_exclusive_ownership (line 322) | static spv::Id build_takes_exclusive_ownership(spv::Builder &builder, ...
function build_allocate_invocation_id_function (line 339) | spv::Id build_allocate_invocation_id_function(SPIRVModule &module, uin...
function build_validate_bda_load_store_function (line 376) | spv::Id build_validate_bda_load_store_function(SPIRVModule &module, ui...
function emit_instrumentation_hash (line 699) | void emit_instrumentation_hash(SPIRVModule &module, const InstructionI...
function build_assume_true_call_function (line 853) | spv::Id build_assume_true_call_function(SPIRVModule &module, const Ins...
function build_nan_inf_instrument_call_function (line 905) | spv::Id build_nan_inf_instrument_call_function(
FILE: spirv_module_instrumentation.hpp
type spv (line 30) | namespace spv
class Function (line 32) | class Function
type dxil_spv (line 35) | namespace dxil_spv
FILE: test_shaders.py
class Paths (line 43) | class Paths():
method __init__ (line 44) | def __init__(self, dxc, dxil_spirv):
function remove_file (line 48) | def remove_file(path):
function create_temporary (line 51) | def create_temporary(suff = ''):
function get_sm (line 56) | def get_sm(shader, version_minor):
function cross_compile_dxil (line 94) | def cross_compile_dxil(shader, args, paths, is_asm):
function make_unix_newline (line 288) | def make_unix_newline(buf):
function md5_for_file (line 293) | def md5_for_file(path):
function make_reference_dir (line 300) | def make_reference_dir(path):
function reference_path (line 305) | def reference_path(directory, relpath, opt):
function regression_check (line 311) | def regression_check(shader, glsl, args):
function test_shader (line 346) | def test_shader(shader, args, paths):
function test_shader_file (line 365) | def test_shader_file(relpath, args):
function test_shaders (line 373) | def test_shaders(args):
function main (line 407) | def main():
FILE: third_party/bc-decoder/llvm_bitreader.h
function namespace (line 30) | namespace LLVMBC
FILE: third_party/bc-decoder/llvm_decoder.cpp
type LLVMBC (line 28) | namespace LLVMBC
type AbbrevEncoding (line 30) | enum class AbbrevEncoding : uint8_t
type AbbrevParam (line 42) | struct AbbrevParam
type AbbrevDesc (line 48) | struct AbbrevDesc
type BlockContext (line 54) | struct BlockContext
method DXIL_SPV_OVERRIDE_NEW_DELETE (line 56) | DXIL_SPV_OVERRIDE_NEW_DELETE
type BlockInfo (line 63) | struct BlockInfo
type AbbrevId (line 70) | enum AbbrevId
type BlockInfoRecord (line 79) | enum class BlockInfoRecord
function BlockOrRecord (line 99) | BlockOrRecord BitcodeReader::ReadToplevelBlock()
function AbbrevDesc (line 309) | const AbbrevDesc &BitcodeReader::getAbbrev(uint32_t blockId, uint32_t ...
FILE: third_party/bc-decoder/llvm_decoder.h
function namespace (line 31) | namespace LLVMBC
FILE: third_party/cli_parser/cli_parser.cpp
type dxil_spv (line 31) | namespace dxil_spv
FILE: third_party/cli_parser/cli_parser.hpp
type dxil_spv (line 32) | namespace dxil_spv
class CLIParser (line 34) | class CLIParser
method is_ended_state (line 63) | bool is_ended_state() const
method ignore_unknown_arguments (line 68) | void ignore_unknown_arguments()
type CLICallbacks (line 36) | struct CLICallbacks
method add (line 38) | void add(const char *cli, const std::function<void(CLIParser &)> &func)
class CLIParser (line 48) | class CLIParser
method is_ended_state (line 63) | bool is_ended_state() const
method ignore_unknown_arguments (line 68) | void ignore_unknown_arguments()
FILE: third_party/glslang-spirv/InReadableOrder.cpp
class ReadableOrderTraverser (line 62) | class ReadableOrderTraverser {
method ReadableOrderTraverser (line 64) | explicit ReadableOrderTraverser(std::function<void(Block*)> callback) ...
method visit (line 69) | void visit(Block* block)
FILE: third_party/glslang-spirv/Logger.cpp
type spv (line 41) | namespace spv {
FILE: third_party/glslang-spirv/Logger.h
function namespace (line 40) | namespace spv {
FILE: third_party/glslang-spirv/SpvBuilder.cpp
type spv (line 52) | namespace spv {
function Id (line 76) | Id Builder::import(const char* name)
function Id (line 141) | Id Builder::makeVoidType()
function Id (line 155) | Id Builder::makeBoolType()
function Id (line 169) | Id Builder::makeSamplerType()
function Id (line 183) | Id Builder::makeAccelerationStructureType()
function Id (line 198) | Id Builder::makeRayQueryType()
function Id (line 213) | Id Builder::makeHitObjectNVType()
function Id (line 228) | Id Builder::makePointer(StorageClass storageClass, Id pointee)
function Id (line 250) | Id Builder::makeIntegerType(int width, bool hasSign)
function Id (line 287) | Id Builder::makeFloatType(int width, int encoding)
function Id (line 336) | Id Builder::makeCooperativeMatrixType(spv::Id scalar_type, spv::Id row...
Copy disabled (too large)
Download .json
Condensed preview — 2195 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,022K chars).
[
{
"path": ".clang-format",
"chars": 5959,
"preview": "# The style used for all options not specifically set in the configuration.\nBasedOnStyle: LLVM\n\n# The extra indent or ou"
},
{
"path": ".gitattributes",
"chars": 70,
"preview": "shaders/**/* linguist-language=GLSL\nreference/**/* linguist-generated\n"
},
{
"path": ".gitignore",
"chars": 223,
"preview": "/cmake-build-debug\n/cmake-build-release\n*.iml\n/.idea\n/.vs\n/.vscode\n/external/dxc*\n/external/DirectXShaderCompiler\n/exter"
},
{
"path": ".gitmodules",
"chars": 484,
"preview": "[submodule \"third_party/spirv-headers\"]\n\tpath = third_party/spirv-headers\n\turl = https://github.com/KhronosGroup/SPIRV-H"
},
{
"path": "CMakeLists.txt",
"chars": 9876,
"preview": "#\n# Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n#\n# SPDX-License-Identifier: MIT\n#\n# Permission "
},
{
"path": "DESCRIPTORS.md",
"chars": 7266,
"preview": "# Full SM 6.0+ descriptor compatibility in Vulkan\n\nIn this document, I aim to rethink how we implement descriptors.\nThe "
},
{
"path": "LICENSE.MIT",
"chars": 3744,
"preview": "Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n\nSPDX-License-Identifier: MIT\n\nPermission is hereby "
},
{
"path": "README.md",
"chars": 5072,
"preview": "# dxil-spirv\n\nThis project aims to provide translation of DXIL (SM 6.x) shaders to SPIR-V which can be used in the vkd3d"
},
{
"path": "bc/CMakeLists.txt",
"chars": 735,
"preview": "add_library(llvm-bc STATIC\n cast.hpp iterator.hpp\n data_structures.hpp\n value.hpp value.cpp\n "
},
{
"path": "bc/cast.hpp",
"chars": 6596,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/context.cpp",
"chars": 2516,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/context.hpp",
"chars": 3193,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/data_structures.hpp",
"chars": 1566,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/disassembler.cpp",
"chars": 23985,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/function.cpp",
"chars": 4815,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/function.hpp",
"chars": 4110,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/instruction.cpp",
"chars": 12402,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/instruction.hpp",
"chars": 11039,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/iterator.hpp",
"chars": 1896,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/metadata.cpp",
"chars": 2967,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/metadata.hpp",
"chars": 2984,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/module.cpp",
"chars": 56402,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/module.hpp",
"chars": 3279,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/module_dxbc_ir.cpp",
"chars": 123395,
"preview": "/* Copyright (c) 2025 Hans-Kristian Arntzen for Valve Corporation\n*\n* SPDX-License-Identifier: MIT\n*\n* Permission is her"
},
{
"path": "bc/type.cpp",
"chars": 8653,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/type.hpp",
"chars": 4823,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/value.cpp",
"chars": 8017,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "bc/value.hpp",
"chars": 6951,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "build_dxc.sh",
"chars": 580,
"preview": "#!/bin/bash\n\nPROFILE=Release\n\nif [ ! -z $1 ]; then\n\tPROFILE=$1\nfi\n\nif [ ! -z $2 ]; then\n\tNPROC=\"--parallel $2\"\nfi\n\necho "
},
{
"path": "cfg_structurizer.cpp",
"chars": 279088,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "cfg_structurizer.hpp",
"chars": 12949,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "checkout_dxc.sh",
"chars": 518,
"preview": "#!/bin/bash\n\nDXC_REV=a9d33d3500d37bd24c10288c76aca8e1c948d4a2\n\nif [ -d external/DirectXShaderCompiler ]; then\n\techo \"Upd"
},
{
"path": "checkout_llvm.sh",
"chars": 508,
"preview": "#!/bin/bash\n\nLLVM_REV=2c4ca6832fa6b306ee6a\n\nif [ -z $PROTOCOL ]; then\n\tPROTOCOL=git\nfi\n\necho \"Using protocol \\\"$PROTOCOL"
},
{
"path": "copy_reference_shaders.py",
"chars": 3548,
"preview": "#!/usr/bin/env python3\n\n# Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n#\n# SPDX-License-Identifie"
},
{
"path": "debug/logging.cpp",
"chars": 1591,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "debug/logging.hpp",
"chars": 7512,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "descriptor_qa.cpp",
"chars": 22879,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "descriptor_qa.hpp",
"chars": 4027,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxbc_spirv_sandbox.cpp",
"chars": 8984,
"preview": "/* Copyright (c) 2025 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n */\n\n#include \"ir/i"
},
{
"path": "dxil-disasm.py",
"chars": 5553,
"preview": "#!/usr/bin/env python3\n\n# Copyright (c) 2019-2023 Hans-Kristian Arntzen for Valve Corporation\n#\n# SPDX-License-Identifie"
},
{
"path": "dxil.hpp",
"chars": 16268,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_converter.cpp",
"chars": 333143,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_converter.hpp",
"chars": 24619,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_extract.cpp",
"chars": 5011,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_parser.cpp",
"chars": 14460,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_parser.hpp",
"chars": 2793,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_spirv.cpp",
"chars": 56141,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_spirv_c.cpp",
"chars": 56973,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "dxil_spirv_c.h",
"chars": 41673,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "external/CMakeLists.txt",
"chars": 1723,
"preview": "if (DXIL_SPIRV_NATIVE_LLVM)\n\tmessage(STATUS \"Building Native LLVM.\")\n\n # Disable everything we can.\n set(LLVM_TARG"
},
{
"path": "format_all.sh",
"chars": 193,
"preview": "#!/bin/bash\n\nfor file in *.{cpp,hpp} debug/*.hpp opcodes/*.{cpp,hpp} opcodes/dxil/*.{cpp,hpp} bc/*.{cpp,hpp}\ndo\n echo"
},
{
"path": "ir.hpp",
"chars": 4186,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "link.T",
"chars": 37,
"preview": "{\n\tglobal: dxil_spv_*;\n\tlocal: *;\n};\n"
},
{
"path": "llvm_bitcode_parser.cpp",
"chars": 2779,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "llvm_bitcode_parser.hpp",
"chars": 1796,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "memory_stream.cpp",
"chars": 3289,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "memory_stream.hpp",
"chars": 2252,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "meson.build",
"chars": 3362,
"preview": "project('dxil-spirv', ['cpp'], version : '0.0', meson_version : '>= 0.49', default_options : ['b_ndebug=if-release'])\n\nd"
},
{
"path": "misc/structurize_test.cpp",
"chars": 9988,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "node.cpp",
"chars": 20373,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "node.hpp",
"chars": 6402,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "node_pool.cpp",
"chars": 1537,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "node_pool.hpp",
"chars": 1600,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/converter_impl.hpp",
"chars": 37319,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_ags.cpp",
"chars": 91061,
"preview": "/* Copyright (c) 2019-2025 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_ags.hpp",
"chars": 36960,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n*\n* SPDX-License-Identifier: MIT\n*\n* Permission i"
},
{
"path": "opcodes/dxil/dxil_arithmetic.cpp",
"chars": 45394,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_arithmetic.hpp",
"chars": 6562,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_buffer.cpp",
"chars": 65546,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_buffer.hpp",
"chars": 3660,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_common.cpp",
"chars": 19551,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_common.hpp",
"chars": 3440,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_compute.cpp",
"chars": 10513,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_compute.hpp",
"chars": 1699,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_geometry.cpp",
"chars": 17426,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_geometry.hpp",
"chars": 2157,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_mesh.cpp",
"chars": 13350,
"preview": "/*\n * Copyright 2022 Philip Rebohle for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permission is hereby "
},
{
"path": "opcodes/dxil/dxil_mesh.hpp",
"chars": 1862,
"preview": "/*\n * Copyright 2022 Philip Rebohle for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permission is hereby "
},
{
"path": "opcodes/dxil/dxil_nvapi.cpp",
"chars": 43002,
"preview": "/* Copyright (c) 2025 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n */\n\n#include \"dxil"
},
{
"path": "opcodes/dxil/dxil_nvapi.hpp",
"chars": 3246,
"preview": "/* Copyright (c) 2025 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n */\n\n#pragma once\n#"
},
{
"path": "opcodes/dxil/dxil_pixel_ops.cpp",
"chars": 11157,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_pixel_ops.hpp",
"chars": 2155,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_ray_tracing.cpp",
"chars": 23321,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_ray_tracing.hpp",
"chars": 6470,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_resources.cpp",
"chars": 103653,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_resources.hpp",
"chars": 4027,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_sampling.cpp",
"chars": 93867,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_sampling.hpp",
"chars": 4253,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_tessellation.cpp",
"chars": 10161,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_tessellation.hpp",
"chars": 1782,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_waveops.cpp",
"chars": 48153,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_waveops.hpp",
"chars": 3839,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/dxil/dxil_workgraph.cpp",
"chars": 54063,
"preview": "/* Copyright (c) 2024 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permission is"
},
{
"path": "opcodes/dxil/dxil_workgraph.hpp",
"chars": 3613,
"preview": "/* Copyright (c) 2024 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permission is"
},
{
"path": "opcodes/opcodes.hpp",
"chars": 1811,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/opcodes_dxil_builtins.cpp",
"chars": 59470,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/opcodes_dxil_builtins.hpp",
"chars": 2172,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/opcodes_llvm_builtins.cpp",
"chars": 90749,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "opcodes/opcodes_llvm_builtins.hpp",
"chars": 4231,
"preview": "/* Copyright (c) 2019-2022 Hans-Kristian Arntzen for Valve Corporation\n *\n * SPDX-License-Identifier: MIT\n *\n * Permissi"
},
{
"path": "pkg-config/dxil-spirv-c-shared.pc.in",
"chars": 359,
"preview": "prefix=@CMAKE_INSTALL_PREFIX@\nexec_prefix=@CMAKE_INSTALL_PREFIX@\nlibdir=@DXIL_SPV_INSTALL_LIB_DIR@\nsharedlibdir=@DXIL_SP"
},
{
"path": "reference/shaders/ags/ags.ssbo.comp",
"chars": 9880,
"preview": "#version 460\n#if defined(GL_ARB_gpu_shader_int64)\n#extension GL_ARB_gpu_shader_int64 : require\n#else\n#error No extension"
},
{
"path": "reference/shaders/ags/cs_constexpr_wmma_gep.sm66.full-wmma.ssbo.comp",
"chars": 9493,
"preview": "#version 460\n#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\n#extension GL_EXT_shader_8bit_storage : r"
},
{
"path": "reference/shaders/ags/cs_constexpr_wmma_gep.sm66.ssbo.comp",
"chars": 14219,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_alloca.sm66.ssbo.comp",
"chars": 10481,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_copy_transpose_fp16.sm66.ssbo.comp",
"chars": 13715,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_copy_transpose_fp16.sm66.ssbo.full-wmma.comp",
"chars": 4606,
"preview": "#version 460\n#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\n#extension GL_EXT_shader_8bit_storage : r"
},
{
"path": "reference/shaders/ags/cs_wmma_extract_insert.sm66.ssbo.full-wmma.comp",
"chars": 6687,
"preview": "#version 460\n#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\n#extension GL_EXT_shader_8bit_storage : r"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_f16.sm66.ssbo.comp",
"chars": 3811,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_f16_at.sm66.ssbo.comp",
"chars": 3814,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_f16_bt.sm66.ssbo.comp",
"chars": 3814,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_f16_ct.sm66.ssbo.comp",
"chars": 3814,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_f16_ot.sm66.ssbo.comp",
"chars": 3814,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_f16_quant_fp8.sm66.ssbo.comp",
"chars": 10327,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8.sm66.ssbo.comp",
"chars": 7216,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8.sm66.ssbo.full-wmma.comp",
"chars": 3335,
"preview": "#version 460\n#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\n#extension GL_EXT_shader_8bit_storage : r"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8_quant_f16.sm66.ssbo.comp",
"chars": 7389,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8_quant_f16_strided.sm66.ssbo.comp",
"chars": 7393,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8_quant_f16_strided_transpose.sm66.ssbo.comp",
"chars": 7405,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_f32_16x16x16_fp8_quant_f32.sm66.ssbo.comp",
"chars": 7216,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_fp16_fp8_conversions.sm66.ssbo.full-wmma.comp",
"chars": 4064,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_fp32_fp16_conversions.sm66.ssbo.full-wmma.comp",
"chars": 3093,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_fp32_fp8_conversions.sm66.ssbo.nv-coopmat2.comp",
"chars": 9469,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_fp8_fp32_conversions.sm66.ssbo.full-wmma.comp",
"chars": 4233,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_lds_transpose.sm66.ssbo.comp",
"chars": 4514,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_matrix_length.sm66.ssbo.comp",
"chars": 5088,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/ags/cs_wmma_store_phi.full-wmma.sm66.ssbo.comp",
"chars": 8211,
"preview": "#version 460\n#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require\n#extension GL_EXT_shader_8bit_storage : r"
},
{
"path": "reference/shaders/ags/cs_wmma_store_phi.sm66.ssbo.comp",
"chars": 12162,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/alloca-opts/bad-stride.frag",
"chars": 4143,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[6];\n} _12;\n\nlayout(location = 0) flat i"
},
{
"path": "reference/shaders/alloca-opts/double-array-load.frag",
"chars": 6586,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n dvec2 _m0[12];\n} _12;\n\nlayout(location = 0) flat"
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.bindless.frag",
"chars": 5640,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.bindless.root-constants.frag",
"chars": 5640,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.frag",
"chars": 4258,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 0, scalar) uniform _9_11\n{\n f"
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.root-constant.frag",
"chars": 8161,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 3, scalar) uniform _12_14\n{\n "
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.root-descriptor.frag",
"chars": 6037,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_buffer_reference_uvec2 : require\n\nlayout(bu"
},
{
"path": "reference/shaders/alloca-opts/float4-array-load.root-descriptor.root-constants.frag",
"chars": 6037,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_buffer_reference_uvec2 : require\n\nlayout(bu"
},
{
"path": "reference/shaders/alloca-opts/load-different.frag",
"chars": 3878,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 0, scalar) uniform _9_11\n{\n f"
},
{
"path": "reference/shaders/alloca-opts/local-root-constants.local-root-signature.rgen",
"chars": 6092,
"preview": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_non"
},
{
"path": "reference/shaders/alloca-opts/matrix-load.frag",
"chars": 5923,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 0, scalar) uniform _9_11\n{\n f"
},
{
"path": "reference/shaders/alloca-opts/missing-first.frag",
"chars": 5215,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[6];\n} _12;\n\nlayout(location = 0) flat i"
},
{
"path": "reference/shaders/alloca-opts/missing-last-element.frag",
"chars": 5191,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[6];\n} _12;\n\nlayout(location = 0) flat i"
},
{
"path": "reference/shaders/alloca-opts/out-of-order-load.frag",
"chars": 3670,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 0, scalar) uniform _9_11\n{\n f"
},
{
"path": "reference/shaders/alloca-opts/store-after-load.frag",
"chars": 6263,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[6];\n} _12;\n\nlayout(location = 0) flat i"
},
{
"path": "reference/shaders/alloca-opts/uint4-array-load.frag",
"chars": 4740,
"preview": "#version 460\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(set = 0, binding = 0, scalar) uniform _8_10\n{\n u"
},
{
"path": "reference/shaders/asm/bfi.bc.dxil",
"chars": 2051,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[1];\n} _12;\n\nlayout(location = 0) out uv"
},
{
"path": "reference/shaders/asm/cbv.no-legacy-cbuf-layout.sm66-heaps-single-alias.bc.dxil",
"chars": 2497,
"preview": "#version 460\n#extension GL_EXT_nonuniform_qualifier : require\n#extension GL_EXT_scalar_block_layout : require\n\nlayout(se"
},
{
"path": "reference/shaders/asm/cbv.no-legacy-cbuf-layout.sm66-heaps.bc.dxil",
"chars": 3793,
"preview": "#version 460\n#if defined(GL_AMD_gpu_shader_half_float)\n#extension GL_AMD_gpu_shader_half_float : require\n#elif defined(G"
},
{
"path": "reference/shaders/asm/constant-struct-aggregate.bc.dxil",
"chars": 1775,
"preview": "#version 460\n\nstruct _13\n{\n float _m0;\n float _m1;\n};\n\nconst _13 _27[4] = _13[](_13(1.0, 2.0), _13(3.0, 4.0), _13("
},
{
"path": "reference/shaders/asm/control-flow-multi-break-with-non-idom-loop-header.dxil",
"chars": 5364,
"preview": "#version 460\nlayout(local_size_x = 8, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, std430) buff"
},
{
"path": "reference/shaders/asm/ibfe.bc.dxil",
"chars": 2020,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[1];\n} _12;\n\nlayout(location = 0) out uv"
},
{
"path": "reference/shaders/asm/ubfe.bc.dxil",
"chars": 2009,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, std140) uniform _10_12\n{\n vec4 _m0[1];\n} _12;\n\nlayout(location = 0) out uv"
},
{
"path": "reference/shaders/auto-barrier/complex-loop.auto-group-shared-barrier.comp",
"chars": 3532,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/auto-barrier/inner-to-inner.auto-group-shared-barrier.comp",
"chars": 3115,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/auto-barrier/inner-to-outer.auto-group-shared-barrier.comp",
"chars": 1980,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/auto-barrier/outer-to-inner.auto-group-shared-barrier.comp",
"chars": 2426,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/auto-barrier/single-block-loop.auto-group-shared-barrier.comp",
"chars": 3038,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/auto-barrier/single-block.auto-group-shared-barrier.comp",
"chars": 2484,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 32, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/control-flow/branch-return-2.comp",
"chars": 4580,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/branch-return.comp",
"chars": 3213,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/branch.comp",
"chars": 3038,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/conditional-break-into-if-else-if-ladder-2.comp",
"chars": 4108,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/conditional-break-into-if-else-if-ladder.comp",
"chars": 4278,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/dual-inner-loop-early-return.comp",
"chars": 5217,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nuint _50;\n\nlayout(set = 0, binding = 0, r"
},
{
"path": "reference/shaders/control-flow/if-else-if-into-continue.comp",
"chars": 3153,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/inner-loop-early-return.comp",
"chars": 4100,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nuint _41;\n\nlayout(set = 0, binding = 0, r"
},
{
"path": "reference/shaders/control-flow/interleaved-unrolled-loop-breaks.comp",
"chars": 11408,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nuint _75;\nuint _77;\nuint _78;\nuint _80;\nu"
},
{
"path": "reference/shaders/control-flow/loop-break-2.comp",
"chars": 3013,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop-break.comp",
"chars": 2654,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop-continue-2.comp",
"chars": 4284,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop-continue-3.comp",
"chars": 4471,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop-continue.comp",
"chars": 3923,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop-inside-infinite-loop-2.frag",
"chars": 8140,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, r32ui) uniform uimageBuffer _8;\n\nlayout(location = 0) flat in uvec4 V;\nlayout"
},
{
"path": "reference/shaders/control-flow/loop-inside-infinite-loop.frag",
"chars": 5238,
"preview": "#version 460\n\nlayout(set = 0, binding = 0, r32ui) uniform uimageBuffer _8;\n\nlayout(location = 0) flat in uvec4 V;\nlayout"
},
{
"path": "reference/shaders/control-flow/loop-return.comp",
"chars": 11194,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/loop.comp",
"chars": 2222,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/nested-loop-break-2.comp",
"chars": 4686,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/nested-loop-break.comp",
"chars": 7451,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/nested-loop.comp",
"chars": 5308,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/selection-merge-split-post-domination.frag",
"chars": 3090,
"preview": "#version 460\n\nlayout(location = 0) in vec4 V;\nlayout(location = 0) out vec4 SV_Target;\n\nvoid main()\n{\n float _25;\n "
},
{
"path": "reference/shaders/control-flow/switch-continue.frag",
"chars": 2704,
"preview": "#version 460\n\nlayout(location = 0) flat in ivec4 I;\nlayout(location = 0) out float SV_Target;\n\nvoid main()\n{\n uint _1"
},
{
"path": "reference/shaders/control-flow/switch-merge-into-other-merge.comp",
"chars": 4308,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/switch-shared-header-with-loop.comp",
"chars": 3466,
"preview": "#version 460\nlayout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n\nlayout(set = 0, binding = 0, r32ui) unifo"
},
{
"path": "reference/shaders/control-flow/wave-size-dependent-loop-unroll.comp",
"chars": 10279,
"preview": "#version 460\n#extension GL_KHR_shader_subgroup_basic : require\nlayout(local_size_x = 64, local_size_y = 1, local_size_z "
},
{
"path": "reference/shaders/descriptor_qa/acceleration-structure.bindless.descriptor-qa.rgen",
"chars": 11706,
"preview": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_non"
},
{
"path": "reference/shaders/descriptor_qa/acceleration-structure.bindless.descriptor-qa.sm66.rgen",
"chars": 11706,
"preview": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_non"
},
{
"path": "reference/shaders/descriptor_qa/acceleration-structure.bindless.ssbo-rtas.local-root-signature.descriptor-qa.rgen",
"chars": 14218,
"preview": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_non"
},
{
"path": "reference/shaders/descriptor_qa/descriptor_qa.bindless.cbv-as-ssbo.descriptor-qa.comp",
"chars": 26399,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/descriptor_qa.bindless.descriptor-qa.comp",
"chars": 26855,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/descriptor_qa.bindless.descriptor-qa.sm66.comp",
"chars": 27666,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/descriptor_qa.bindless.ssbo.descriptor-qa.comp",
"chars": 26563,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/early-2.bindless.descriptor-qa.frag",
"chars": 11134,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/early-3.bindless.descriptor-qa.frag",
"chars": 10536,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/early-4.bindless.descriptor-qa.frag",
"chars": 10619,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/early-5.bindless.descriptor-qa.frag",
"chars": 11429,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/descriptor_qa/early-heap.descriptor-qa.sm66.frag",
"chars": 9439,
"preview": "#version 460\n#extension GL_EXT_nonuniform_qualifier : require\n#extension GL_EXT_scalar_block_layout : require\n#extension"
},
{
"path": "reference/shaders/descriptor_qa/early.bindless.descriptor-qa.frag",
"chars": 10421,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n#extension G"
},
{
"path": "reference/shaders/dxil-builtin/accept-hit-and-end-search-ignore-hit.rany",
"chars": 2090,
"preview": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_nonuniform_qualifier : require\n\nstruct _6\n{\n f"
},
{
"path": "reference/shaders/dxil-builtin/acos.frag",
"chars": 837,
"preview": "#version 460\n\nlayout(location = 0) in float A;\nlayout(location = 0) out float SV_Target;\n\nvoid main()\n{\n SV_Target = "
},
{
"path": "reference/shaders/dxil-builtin/asin.frag",
"chars": 837,
"preview": "#version 460\n\nlayout(location = 0) in float A;\nlayout(location = 0) out float SV_Target;\n\nvoid main()\n{\n SV_Target = "
},
{
"path": "reference/shaders/dxil-builtin/atan.frag",
"chars": 837,
"preview": "#version 460\n\nlayout(location = 0) in float A;\nlayout(location = 0) out float SV_Target;\n\nvoid main()\n{\n SV_Target = "
},
{
"path": "reference/shaders/dxil-builtin/atomic-bin-op.bindless.root-constant.frag",
"chars": 3487,
"preview": "#version 460\n#extension GL_EXT_buffer_reference2 : require\n#extension GL_EXT_nonuniform_qualifier : require\n\nlayout(push"
}
]
// ... and 1995 more files (download for full content)
About this extraction
This page contains the full source code of the HansKristian-Work/dxil-spirv GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2195 files (9.0 MB), approximately 2.5M tokens, and a symbol index with 2179 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.