1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLModifiersDeclaration.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLContext.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLErrorReporter.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLModifiers.h"
16*c8dee2aaSAndroid Build Coastguard Worker
17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL {
20*c8dee2aaSAndroid Build Coastguard Worker
21*c8dee2aaSAndroid Build Coastguard Worker enum class ProgramKind : int8_t;
22*c8dee2aaSAndroid Build Coastguard Worker
Convert(const Context & context,const Modifiers & modifiers)23*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ModifiersDeclaration> ModifiersDeclaration::Convert(const Context& context,
24*c8dee2aaSAndroid Build Coastguard Worker const Modifiers& modifiers) {
25*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramKind kind = context.fConfig->fKind;
26*c8dee2aaSAndroid Build Coastguard Worker if (!ProgramConfig::IsFragment(kind) && !ProgramConfig::IsVertex(kind) &&
27*c8dee2aaSAndroid Build Coastguard Worker !ProgramConfig::IsCompute(kind)) {
28*c8dee2aaSAndroid Build Coastguard Worker context.fErrors->error(modifiers.fPosition,
29*c8dee2aaSAndroid Build Coastguard Worker "layout qualifiers are not allowed in this kind of program");
30*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
31*c8dee2aaSAndroid Build Coastguard Worker }
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker if (modifiers.fLayout.fLocalSizeX >= 0 ||
34*c8dee2aaSAndroid Build Coastguard Worker modifiers.fLayout.fLocalSizeY >= 0 ||
35*c8dee2aaSAndroid Build Coastguard Worker modifiers.fLayout.fLocalSizeZ >= 0) {
36*c8dee2aaSAndroid Build Coastguard Worker if (modifiers.fLayout.fLocalSizeX == 0 ||
37*c8dee2aaSAndroid Build Coastguard Worker modifiers.fLayout.fLocalSizeY == 0 ||
38*c8dee2aaSAndroid Build Coastguard Worker modifiers.fLayout.fLocalSizeZ == 0) {
39*c8dee2aaSAndroid Build Coastguard Worker context.fErrors->error(modifiers.fPosition, "local size qualifiers cannot be zero");
40*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker if (!ProgramConfig::IsCompute(kind)) {
43*c8dee2aaSAndroid Build Coastguard Worker context.fErrors->error(
44*c8dee2aaSAndroid Build Coastguard Worker modifiers.fPosition,
45*c8dee2aaSAndroid Build Coastguard Worker "local size layout qualifiers are only allowed in a compute program");
46*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker if (modifiers.fFlags != ModifierFlag::kIn) {
49*c8dee2aaSAndroid Build Coastguard Worker context.fErrors->error(
50*c8dee2aaSAndroid Build Coastguard Worker modifiers.fPosition,
51*c8dee2aaSAndroid Build Coastguard Worker "local size layout qualifiers must be defined using an 'in' declaration");
52*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker }
55*c8dee2aaSAndroid Build Coastguard Worker
56*c8dee2aaSAndroid Build Coastguard Worker return ModifiersDeclaration::Make(context, modifiers);
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker
Make(const Context & context,const Modifiers & modifiers)59*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ModifiersDeclaration> ModifiersDeclaration::Make(const Context& context,
60*c8dee2aaSAndroid Build Coastguard Worker const Modifiers& modifiers) {
61*c8dee2aaSAndroid Build Coastguard Worker [[maybe_unused]] SkSL::ProgramKind kind = context.fConfig->fKind;
62*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(ProgramConfig::IsFragment(kind) || ProgramConfig::IsVertex(kind) ||
63*c8dee2aaSAndroid Build Coastguard Worker ProgramConfig::IsCompute(kind));
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<ModifiersDeclaration>(modifiers.fPosition,
66*c8dee2aaSAndroid Build Coastguard Worker modifiers.fLayout,
67*c8dee2aaSAndroid Build Coastguard Worker modifiers.fFlags);
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL
71