• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SKSL_HCODEGENERATOR
9 #define SKSL_HCODEGENERATOR
10 
11 #include "SkSLCodeGenerator.h"
12 #include "SkSLSectionAndParameterHelper.h"
13 #include "ir/SkSLType.h"
14 #include "ir/SkSLVariable.h"
15 
16 #include <cctype>
17 
18 constexpr const char* kFragmentProcessorHeader =
19 R"(
20 /**************************************************************************************************
21  *** This file was autogenerated from %s.fp; do not modify.
22  **************************************************************************************************/
23 )";
24 
25 namespace SkSL {
26 
27 class HCodeGenerator : public CodeGenerator {
28 public:
29     HCodeGenerator(const Context* context, const Program* program, ErrorReporter* errors,
30                    String name, OutputStream* out);
31 
32     bool generateCode() override;
33 
34     static String ParameterType(const Context& context, const Type& type, const Layout& layout);
35 
36     static Layout::CType ParameterCType(const Context& context, const Type& type,
37                                         const Layout& layout);
38 
39     static String FieldType(const Context& context, const Type& type, const Layout& layout);
40 
41     // Either the field type, or a const reference of the field type if the field type is complex.
42     static String AccessType(const Context& context, const Type& type, const Layout& layout);
43 
FieldName(const char * varName)44     static String FieldName(const char* varName) {
45         return String::printf("f%c%s", toupper(varName[0]), varName + 1);
46     }
47 
CoordTransformName(const String & arg,int index)48     static String CoordTransformName(const String& arg, int index) {
49         if (arg.size()) {
50             return HCodeGenerator::FieldName(arg.c_str()) + "CoordTransform";
51         }
52         return "fCoordTransform" + to_string(index);
53     }
54 
55     static String GetHeader(const Program& program, ErrorReporter& errors);
56 
57 private:
58     void writef(const char* s, va_list va) SKSL_PRINTF_LIKE(2, 0);
59 
60     void writef(const char* s, ...) SKSL_PRINTF_LIKE(2, 3);
61 
62     bool writeSection(const char* name, const char* prefix = "");
63 
64     // given a @constructorParams section of e.g. 'int x, float y', writes out "<separator>x, y".
65     // Writes nothing (not even the separator) if there is no @constructorParams section.
66     void writeExtraConstructorParams(const char* separator);
67 
68     void writeMake();
69 
70     void writeConstructor();
71 
72     void writeFields();
73 
74     void failOnSection(const char* section, const char* msg);
75 
76     const Context& fContext;
77     String fName;
78     String fFullName;
79     SectionAndParameterHelper fSectionAndParameterHelper;
80 
81     typedef CodeGenerator INHERITED;
82 };
83 
84 } // namespace SkSL
85 
86 #endif
87