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