blob: ff8785ddbeefad5909f7da600c8f71745034034b [file] [log] [blame]
Austin Engcc2516a2023-10-17 20:57:54 +00001// Copyright 2021 The Dawn & Tint Authors
Ryan Harrisondbc13af2022-02-21 15:19:07 +00002//
Austin Engcc2516a2023-10-17 20:57:54 +00003// Redistribution and use in source and binary forms, with or without
4// modification, are permitted provided that the following conditions are met:
Ryan Harrisondbc13af2022-02-21 15:19:07 +00005//
Austin Engcc2516a2023-10-17 20:57:54 +00006// 1. Redistributions of source code must retain the above copyright notice, this
7// list of conditions and the following disclaimer.
Ryan Harrisondbc13af2022-02-21 15:19:07 +00008//
Austin Engcc2516a2023-10-17 20:57:54 +00009// 2. Redistributions in binary form must reproduce the above copyright notice,
10// this list of conditions and the following disclaimer in the documentation
11// and/or other materials provided with the distribution.
12//
13// 3. Neither the name of the copyright holder nor the names of its
14// contributors may be used to endorse or promote products derived from
15// this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ryan Harrisondbc13af2022-02-21 15:19:07 +000027
dan sinclair99181d82023-07-20 01:14:15 +000028#ifndef SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_
29#define SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_
Ryan Harrisondbc13af2022-02-21 15:19:07 +000030
31#include <unordered_map>
32
Ben Claytonc1942cf2023-08-16 19:15:21 +000033#include "src/tint/api/common/binding_point.h"
Ben Claytoncd52f382023-08-07 13:11:08 +000034#include "src/tint/lang/core/access.h"
dan sinclair99181d82023-07-20 01:14:15 +000035#include "src/tint/lang/wgsl/ast/transform/transform.h"
Ben Claytonb3484ec2024-04-25 12:05:22 +000036#include "src/tint/utils/reflection/reflection.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000037
James Priceb4acbb82023-05-11 21:27:16 +000038namespace tint::ast::transform {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000039
Ben Clayton10252582023-07-25 20:53:25 +000040/// BindingPoint is an alias to BindingPoint
41using BindingPoint = BindingPoint;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000042
43/// BindingRemapper is a transform used to remap resource binding points and
44/// access controls.
dan sinclairbae54e72023-07-28 15:01:54 +000045class BindingRemapper final : public Castable<BindingRemapper, Transform> {
dan sinclair41e4d9a2022-05-01 14:40:55 +000046 public:
47 /// BindingPoints is a map of old binding point to new binding point
48 using BindingPoints = std::unordered_map<BindingPoint, BindingPoint>;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000049
dan sinclair41e4d9a2022-05-01 14:40:55 +000050 /// AccessControls is a map of old binding point to new access control
Ben Claytoncd52f382023-08-07 13:11:08 +000051 using AccessControls = std::unordered_map<BindingPoint, core::Access>;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000052
dan sinclair41e4d9a2022-05-01 14:40:55 +000053 /// Remappings is consumed by the BindingRemapper transform.
54 /// Data holds information about shader usage and constant buffer offsets.
dan sinclairbae54e72023-07-28 15:01:54 +000055 struct Remappings final : public Castable<Remappings, Data> {
dan sinclair41e4d9a2022-05-01 14:40:55 +000056 /// Constructor
Ben Claytonb3484ec2024-04-25 12:05:22 +000057 Remappings();
58
59 /// Constructor
dan sinclair41e4d9a2022-05-01 14:40:55 +000060 /// @param bp a map of new binding points
61 /// @param ac a map of new access controls
62 /// @param may_collide If true, then validation will be disabled for
63 /// binding point collisions generated by this transform
64 Remappings(BindingPoints bp, AccessControls ac, bool may_collide = true);
65
66 /// Copy constructor
67 Remappings(const Remappings&);
68
69 /// Destructor
70 ~Remappings() override;
71
72 /// A map of old binding point to new binding point
Ben Claytonb3484ec2024-04-25 12:05:22 +000073 BindingPoints binding_points;
dan sinclair41e4d9a2022-05-01 14:40:55 +000074
75 /// A map of old binding point to new access controls
Ben Claytonb3484ec2024-04-25 12:05:22 +000076 AccessControls access_controls;
dan sinclair41e4d9a2022-05-01 14:40:55 +000077
78 /// If true, then validation will be disabled for binding point collisions
79 /// generated by this transform
Ben Claytonb3484ec2024-04-25 12:05:22 +000080 bool allow_collisions = false;
81
82 /// Reflection for this class
83 TINT_REFLECT(Remappings, binding_points, access_controls, allow_collisions);
dan sinclair41e4d9a2022-05-01 14:40:55 +000084 };
85
Ryan Harrisondbc13af2022-02-21 15:19:07 +000086 /// Constructor
dan sinclair41e4d9a2022-05-01 14:40:55 +000087 BindingRemapper();
88 ~BindingRemapper() override;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000089
Ben Claytonc6b38142022-11-03 08:41:19 +000090 /// @copydoc Transform::Apply
Ben Clayton5ed5cc42023-09-22 10:31:04 +000091 ApplyResult Apply(const Program& program,
Ben Claytonc6b38142022-11-03 08:41:19 +000092 const DataMap& inputs,
93 DataMap& outputs) const override;
Ryan Harrisondbc13af2022-02-21 15:19:07 +000094};
95
James Priceb4acbb82023-05-11 21:27:16 +000096} // namespace tint::ast::transform
Ryan Harrisondbc13af2022-02-21 15:19:07 +000097
dan sinclair99181d82023-07-20 01:14:15 +000098#endif // SRC_TINT_LANG_WGSL_AST_TRANSFORM_BINDING_REMAPPER_H_