blob: 07f3e0e17d3ea6b9c33921c91df5632f8aa9044f [file] [log] [blame]
Brian Osman0a442b72020-12-02 11:12:51 -05001/*
2 * Copyright 2020 Google LLC
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_VMGENERATOR
9#define SKSL_VMGENERATOR
10
Ethan Nicholasdaed2592021-03-04 14:30:25 -050011#include "include/private/SkSLString.h"
Brian Osman0a442b72020-12-02 11:12:51 -050012#include "src/core/SkSpan.h"
13#include "src/core/SkVM.h"
Brian Osmane89d8ea2021-01-20 14:01:30 -050014#include "src/sksl/ir/SkSLType.h"
Brian Osman0a442b72020-12-02 11:12:51 -050015
16#include <functional>
17
18namespace SkSL {
19
20class FunctionDefinition;
21struct Program;
22
23using SampleChildFn = std::function<skvm::Color(int, skvm::Coord)>;
24
25// TODO: Have a generic entry point, supporting SkSpan<skvm::Val> for parameters and return values.
26// That would be useful for interpreter use cases like SkParticleEffect.
27
28// Convert 'function' to skvm instructions in 'builder', for use by shaders and color filters
29skvm::Color ProgramToSkVM(const Program& program,
30 const FunctionDefinition& function,
31 skvm::Builder* builder,
32 SkSpan<skvm::Val> uniforms,
33 skvm::Coord device,
34 skvm::Coord local,
35 SampleChildFn sampleChild);
36
Brian Osmanf4a77732020-12-28 09:03:00 -050037struct SkVMSignature {
38 size_t fParameterSlots = 0;
39 size_t fReturnSlots = 0;
40};
41
42/*
Brian Osmanc92df392021-01-11 13:16:28 -050043 * Converts 'function' to skvm instructions in 'builder'. Always adds one arg per value in the
44 * parameter list, then one per value in the return type. For example:
Brian Osmanf4a77732020-12-28 09:03:00 -050045 *
Brian Osmanf4a77732020-12-28 09:03:00 -050046 * float2 fn(float2 a, float b) { ... }
47 *
48 * ... is mapped so that it can be called as:
49 *
Brian Osmanc92df392021-01-11 13:16:28 -050050 * p.eval(N, &a.x, &a.y, &b, &return.x, &return.y);
Brian Osmanf4a77732020-12-28 09:03:00 -050051 *
52 * The number of parameter and return slots (pointers) is placed in 'outSignature', if provided.
Brian Osmanc92df392021-01-11 13:16:28 -050053 * If the program declares any uniforms, 'uniforms' should contain the IDs of each individual value
54 * (eg, one ID per component of a vector).
Brian Osmanf4a77732020-12-28 09:03:00 -050055 */
56bool ProgramToSkVM(const Program& program,
57 const FunctionDefinition& function,
58 skvm::Builder* b,
Brian Osmanc92df392021-01-11 13:16:28 -050059 SkSpan<skvm::Val> uniforms,
Brian Osmanf4a77732020-12-28 09:03:00 -050060 SkVMSignature* outSignature = nullptr);
61
Brian Osman5933d4c2021-01-05 13:02:20 -050062const FunctionDefinition* Program_GetFunction(const Program& program, const char* function);
63
Brian Osmane89d8ea2021-01-20 14:01:30 -050064struct UniformInfo {
65 struct Uniform {
66 String fName;
67 Type::NumberKind fKind;
68 int fColumns;
69 int fRows;
70 int fSlot;
71 };
72 std::vector<Uniform> fUniforms;
73 int fUniformSlotCount = 0;
74};
75
76std::unique_ptr<UniformInfo> Program_GetUniformInfo(const Program& program);
77
Brian Osman47726a12020-12-17 16:02:08 -050078bool testingOnly_ProgramToSkVMShader(const Program& program, skvm::Builder* builder);
79
Brian Osman0a442b72020-12-02 11:12:51 -050080} // namespace SkSL
81
82#endif