// Copyright 2023 The Dawn & Tint Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "src/tint/lang/spirv/writer/common/option_helpers.h" #include <utility> #include "src/tint/utils/containers/hashset.h" namespace tint::spirv::writer { Result<SuccessType> ValidateBindingOptions(const Options& options) { … } // The remapped binding data and external texture data need to coordinate in order to put things in // the correct place when we're done. // // When the data comes in we have a list of all WGSL origin (group,binding) pairs to SPIR-V // (group,binding) pairs in the `uniform`, `storage`, `texture`, and `sampler` arrays. // // The `external_texture` array stores a WGSL origin (group,binding) pair for the external textures // which provide `plane0`, `plane1`, and `metadata` SPIR-V (group,binding) pairs. // // If the remapper is run first, then the `external_texture` will end up being moved from the WGSL // point, or the SPIR-V point (or the `plane0` value). There will also, possibly, have been bindings // moved aside in order to place the `external_texture` bindings. // // If multiplanar runs first, care needs to be taken that when the texture is split and we create // `plane1` and `metadata` that they do not collide with existing bindings. If they would collide // then we need to place them elsewhere and have the remapper place them in the correct locations. // // # Example // WGSL: // @group(0) @binding(0) var<uniform> u: Uniforms; // @group(0) @binding(1) var s: sampler; // @group(0) @binding(2) var t: texture_external; // // Given that program, Dawn may decide to do the remappings such that: // * WGSL u (0, 0) -> SPIR-V (0, 1) // * WGSL s (0, 1) -> SPIR-V (0, 2) // * WGSL t (0, 2): // * plane0 -> SPIR-V (0, 3) // * plane1 -> SPIR-V (0, 4) // * metadata -> SPIR-V (0, 0) // // In this case, if we run binding remapper first, then tell multiplanar to look for the texture at // (0, 3) instead of the original (0, 2). // // If multiplanar runs first, then metadata (0, 0) needs to be placed elsewhere and then remapped // back to (0, 0) by the remapper. (Otherwise, we'll have two `@group(0) @binding(0)` items in the // program.) // // # Status // The below method assumes we run binding remapper first. So it will setup the binding data and // switch the value used by the multiplanar. void PopulateRemapperAndMultiplanarOptions( const Options& options, RemapperData& remapper_data, tint::transform::multiplanar::BindingsMap& multiplanar_map) { … } } // namespace tint::spirv::writer