SkSLHCodeGenerator.h revision 46b654df9e70bbfacf6dc45d3a2a7ceb13a61edb
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
18constexpr const char* kFragmentProcessorHeader =
19R"(/*
20 * Copyright 2017 Google Inc.
21 *
22 * Use of this source code is governed by a BSD-style license that can be
23 * found in the LICENSE file.
24 */
25
26/*
27 * This file was autogenerated from %s.fp; do not modify.
28 */
29)";
30
31namespace SkSL {
32
33class HCodeGenerator : public CodeGenerator {
34public:
35    HCodeGenerator(const Program* program, ErrorReporter* errors, String name, OutputStream* out);
36
37    bool generateCode() override;
38
39    static String ParameterType(const Type& type);
40
41    static String FieldType(const Type& type);
42
43    static String FieldName(const char* varName) {
44        return String::printf("f%c%s", toupper(varName[0]), varName + 1);
45    }
46
47private:
48    void writef(const char* s, va_list va) SKSL_PRINTF_LIKE(2, 0);
49
50    void writef(const char* s, ...) SKSL_PRINTF_LIKE(2, 3);
51
52    bool writeSection(const char* name, const char* prefix = "");
53
54    // given a @constructorParams section of e.g. 'int x, float y', writes out "<separator>x, y".
55    // Writes nothing (not even the separator) if there is no @constructorParams section.
56    void writeExtraConstructorParams(const char* separator);
57
58    void writeMake();
59
60    void writeConstructor();
61
62    void writeFields();
63
64    void failOnSection(const char* section, const char* msg);
65
66    String fName;
67    String fFullName;
68    SectionAndParameterHelper fSectionAndParameterHelper;
69
70    typedef CodeGenerator INHERITED;
71};
72
73} // namespace SkSL
74
75#endif
76