1// Copyright (c) 2017 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef SOURCE_VAL_DECORATION_H_
16#define SOURCE_VAL_DECORATION_H_
17
18#include <cstdint>
19#include <unordered_map>
20#include <vector>
21
22#include "source/latest_version_spirv_header.h"
23
24namespace spvtools {
25namespace val {
26
27// An object of this class represents a specific decoration including its
28// parameters (if any). Decorations are used by OpDecorate and OpMemberDecorate,
29// and they describe certain properties that can be assigned to one or several
30// <id>s.
31//
32// A Decoration object contains the decoration type (an enum), associated
33// literal parameters, and struct member index. If the decoration does not apply
34// to a struct member, then the index is kInvalidIndex. A Decoration object does
35// not store the target Id, i.e. the Id to which it applies. It is
36// possible for the same decoration to be applied to several <id>s (and they
37// might be assigned using separate SPIR-V instructions, possibly using an
38// assignment through GroupDecorate).
39//
40// Example 1: Decoration for an object<id> with no parameters:
41// OpDecorate %obj Flat
42// dec_type_ = SpvDecorationFlat
43// params_ = empty vector
44// struct_member_index_ = kInvalidMember
45//
46// Example 2: Decoration for an object<id> with two parameters:
47// OpDecorate %obj LinkageAttributes "link" Import
48// dec_type_ = SpvDecorationLinkageAttributes
49// params_ = vector { link, Import }
50// struct_member_index_ = kInvalidMember
51//
52// Example 3: Decoration for a member of a structure with one parameter:
53// OpMemberDecorate %struct 2 Offset 2
54// dec_type_ = SpvDecorationOffset
55// params_ = vector { 2 }
56// struct_member_index_ = 2
57//
58class Decoration {
59 public:
60 enum { kInvalidMember = -1 };
61 Decoration(SpvDecoration t,
62 const std::vector<uint32_t>& parameters = std::vector<uint32_t>(),
63 uint32_t member_index = kInvalidMember)
64 : dec_type_(t), params_(parameters), struct_member_index_(member_index) {}
65
66 void set_struct_member_index(uint32_t index) { struct_member_index_ = index; }
67 int struct_member_index() const { return struct_member_index_; }
68 SpvDecoration dec_type() const { return dec_type_; }
69 std::vector<uint32_t>& params() { return params_; }
70 const std::vector<uint32_t>& params() const { return params_; }
71
72 inline bool operator==(const Decoration& rhs) const {
73 return (dec_type_ == rhs.dec_type_ && params_ == rhs.params_ &&
74 struct_member_index_ == rhs.struct_member_index_);
75 }
76
77 private:
78 SpvDecoration dec_type_;
79 std::vector<uint32_t> params_;
80
81 // If the decoration applies to a member of a structure type, then the index
82 // of the member is stored here. Otherwise, this is kInvalidIndex.
83 int struct_member_index_;
84};
85
86} // namespace val
87} // namespace spvtools
88
89#endif // SOURCE_VAL_DECORATION_H_
90