blob: c175fc6adf6e575db7de71e4cb6ac14c714f1ab8 [file] [log] [blame]
egdaniel8dcdedc2015-11-11 06:27:20 -08001/*
2 * Copyright 2015 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 GrGLSLProgramBuilder_DEFINED
9#define GrGLSLProgramBuilder_DEFINED
10
11#include "GrGeometryProcessor.h"
12#include "GrGpu.h"
egdaniel2d721d32015-11-11 13:06:05 -080013#include "glsl/GrGLSLFragmentShaderBuilder.h"
14#include "glsl/GrGLSLGeometryShaderBuilder.h"
egdanielfa896322016-01-13 12:19:30 -080015#include "glsl/GrGLSLPrimitiveProcessor.h"
egdaniel8dcdedc2015-11-11 06:27:20 -080016#include "glsl/GrGLSLProgramDataManager.h"
egdaniel7ea439b2015-12-03 09:20:44 -080017#include "glsl/GrGLSLUniformHandler.h"
cdalton3f6f76f2016-04-11 12:18:09 -070018#include "glsl/GrGLSLSampler.h"
egdaniel2d721d32015-11-11 13:06:05 -080019#include "glsl/GrGLSLVertexShaderBuilder.h"
egdanielfa896322016-01-13 12:19:30 -080020#include "glsl/GrGLSLXferProcessor.h"
egdaniel8dcdedc2015-11-11 06:27:20 -080021
22class GrGLSLCaps;
23class GrGLSLShaderVar;
egdaniel0eafe792015-11-20 14:01:22 -080024class GrGLSLVaryingHandler;
egdaniel8dcdedc2015-11-11 06:27:20 -080025
egdanielfa896322016-01-13 12:19:30 -080026typedef SkSTArray<8, GrGLSLFragmentProcessor*, true> GrGLSLFragProcs;
27
egdaniel7ea439b2015-12-03 09:20:44 -080028class GrGLSLProgramBuilder {
egdaniel8dcdedc2015-11-11 06:27:20 -080029public:
egdaniel7ea439b2015-12-03 09:20:44 -080030 typedef GrGLSLUniformHandler::UniformHandle UniformHandle;
31
32 virtual ~GrGLSLProgramBuilder() {}
egdaniel8dcdedc2015-11-11 06:27:20 -080033
egdanielfa896322016-01-13 12:19:30 -080034 virtual const GrCaps* caps() const = 0;
egdaniela2e3e0f2015-11-19 07:23:45 -080035 virtual const GrGLSLCaps* glslCaps() const = 0;
36
egdaniel0e1853c2016-03-17 11:35:45 -070037 const GrPrimitiveProcessor& primitiveProcessor() const { return fPrimProc; }
38 const GrPipeline& pipeline() const { return fPipeline; }
39 const GrProgramDesc& desc() const { return fDesc; }
40 const GrProgramDesc::KeyHeader& header() const { return fDesc.header(); }
egdaniel7ea439b2015-12-03 09:20:44 -080041
cdalton5e58cee2016-02-11 12:49:47 -080042 void appendUniformDecls(GrShaderFlags visibility, SkString*) const;
egdaniel7ea439b2015-12-03 09:20:44 -080043
egdaniel09aa1fc2016-04-20 07:09:46 -070044 typedef GrGLSLUniformHandler::SamplerHandle SamplerHandle;
45
46 const GrGLSLSampler& getSampler(SamplerHandle handle) const;
47
egdaniel8dcdedc2015-11-11 06:27:20 -080048 // Handles for program uniforms (other than per-effect uniforms)
49 struct BuiltinUniformHandles {
50 UniformHandle fRTAdjustmentUni;
51
52 // We use the render target height to provide a y-down frag coord when specifying
53 // origin_upper_left is not supported.
54 UniformHandle fRTHeightUni;
55 };
56
egdaniel7ea439b2015-12-03 09:20:44 -080057 // Used to add a uniform in the vertex shader for transforming into normalized device space.
58 void addRTAdjustmentUniform(GrSLPrecision precision, const char* name, const char** outName);
egdaniel8dcdedc2015-11-11 06:27:20 -080059 const char* rtAdjustment() const { return "rtAdjustment"; }
halcanary9d524f22016-03-29 09:03:52 -070060
egdaniel7ea439b2015-12-03 09:20:44 -080061 // Used to add a uniform for the RenderTarget height (used for frag position) without mangling
62 // the name of the uniform inside of a stage.
63 void addRTHeightUniform(const char* name, const char** outName);
egdaniel8dcdedc2015-11-11 06:27:20 -080064
65 // Generates a name for a variable. The generated string will be name prefixed by the prefix
66 // char (unless the prefix is '\0'). It also will mangle the name to be stage-specific unless
67 // explicitly asked not to.
68 void nameVariable(SkString* out, char prefix, const char* name, bool mangle = true);
69
egdaniel7ea439b2015-12-03 09:20:44 -080070 virtual GrGLSLUniformHandler* uniformHandler() = 0;
71 virtual const GrGLSLUniformHandler* uniformHandler() const = 0;
egdaniel0eafe792015-11-20 14:01:22 -080072 virtual GrGLSLVaryingHandler* varyingHandler() = 0;
73
egdanielb80ec8b2016-02-09 09:54:43 -080074 // Used for backend customization of the output color and secondary color variables from the
75 // fragment processor. Only used if the outputs are explicitly declared in the shaders
76 virtual void finalizeFragmentOutputColor(GrGLSLShaderVar& outputColor) {}
77 virtual void finalizeFragmentSecondaryColor(GrGLSLShaderVar& outputColor) {}
78
egdaniel8dcdedc2015-11-11 06:27:20 -080079 // number of each input/output type in a single allocation block, used by many builders
80 static const int kVarsPerBlock;
81
egdaniel0eafe792015-11-20 14:01:22 -080082 GrGLSLVertexBuilder fVS;
83 GrGLSLGeometryBuilder fGS;
egdaniel2d721d32015-11-11 13:06:05 -080084 GrGLSLFragmentShaderBuilder fFS;
egdaniel0eafe792015-11-20 14:01:22 -080085
egdaniel8dcdedc2015-11-11 06:27:20 -080086 int fStageIndex;
87
egdaniel0e1853c2016-03-17 11:35:45 -070088 const GrPipeline& fPipeline;
89 const GrPrimitiveProcessor& fPrimProc;
90 const GrProgramDesc& fDesc;
egdaniel8dcdedc2015-11-11 06:27:20 -080091
egdaniel7ea439b2015-12-03 09:20:44 -080092 BuiltinUniformHandles fUniformHandles;
egdaniel8dcdedc2015-11-11 06:27:20 -080093
egdanielfa896322016-01-13 12:19:30 -080094 GrGLSLPrimitiveProcessor* fGeometryProcessor;
95 GrGLSLXferProcessor* fXferProcessor;
96 GrGLSLFragProcs fFragmentProcessors;
97
egdaniel7ea439b2015-12-03 09:20:44 -080098protected:
egdaniel0e1853c2016-03-17 11:35:45 -070099 explicit GrGLSLProgramBuilder(const GrPipeline&,
100 const GrPrimitiveProcessor&,
101 const GrProgramDesc&);
egdanielfa896322016-01-13 12:19:30 -0800102
cdalton9c3f1432016-03-11 10:07:37 -0800103 void addFeature(GrShaderFlags shaders, uint32_t featureBit, const char* extensionName);
104
105 bool emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr4* inputCoverage);
egdanielfa896322016-01-13 12:19:30 -0800106
107 void cleanupFragmentProcessors();
108
egdaniel9f1d4152016-02-10 09:50:38 -0800109 void finalizeShaders();
110
egdanielfa896322016-01-13 12:19:30 -0800111private:
112 // reset is called by program creator between each processor's emit code. It increments the
113 // stage offset for variable name mangling, and also ensures verfication variables in the
114 // fragment shader are cleared.
115 void reset() {
116 this->addStage();
cdalton87332102016-02-26 12:22:02 -0800117 SkDEBUGCODE(fFS.resetVerification();)
egdanielfa896322016-01-13 12:19:30 -0800118 }
119 void addStage() { fStageIndex++; }
120
121 class AutoStageAdvance {
122 public:
123 AutoStageAdvance(GrGLSLProgramBuilder* pb)
124 : fPB(pb) {
125 fPB->reset();
126 // Each output to the fragment processor gets its own code section
127 fPB->fFS.nextStage();
128 }
129 ~AutoStageAdvance() {}
130 private:
131 GrGLSLProgramBuilder* fPB;
132 };
133
134 // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
135 // If GrGLSLExpr4 has a valid name then it will use that instead
136 void nameExpression(GrGLSLExpr4*, const char* baseName);
137
138 void emitAndInstallPrimProc(const GrPrimitiveProcessor&,
139 GrGLSLExpr4* outputColor,
140 GrGLSLExpr4* outputCoverage);
141 void emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut);
142 void emitAndInstallFragProc(const GrFragmentProcessor&,
143 int index,
144 const GrGLSLExpr4& input,
145 GrGLSLExpr4* output);
146 void emitAndInstallXferProc(const GrXferProcessor&,
147 const GrGLSLExpr4& colorIn,
148 const GrGLSLExpr4& coverageIn,
ethannicholas22793252016-01-30 09:59:10 -0800149 bool ignoresCoverage,
150 GrPixelLocalStorageState plsState);
egdaniel09aa1fc2016-04-20 07:09:46 -0700151
cdalton74b8d322016-04-11 14:47:28 -0700152 void emitSamplers(const GrProcessor& processor,
egdaniel09aa1fc2016-04-20 07:09:46 -0700153 SkTArray<SamplerHandle>* outTexSamplers,
154 SkTArray<SamplerHandle>* outBufferSamplers);
cdalton74b8d322016-04-11 14:47:28 -0700155 void emitSampler(GrSLType samplerType,
156 GrPixelConfig,
157 const char* name,
158 GrShaderFlags visibility,
egdaniel09aa1fc2016-04-20 07:09:46 -0700159 SkTArray<SamplerHandle>* outSamplers);
egdanielfa896322016-01-13 12:19:30 -0800160 void emitFSOutputSwizzle(bool hasSecondaryOutput);
cdalton9c3f1432016-03-11 10:07:37 -0800161 bool checkSamplerCounts();
egdanielfa896322016-01-13 12:19:30 -0800162
cdalton87332102016-02-26 12:22:02 -0800163#ifdef SK_DEBUG
egdanielfa896322016-01-13 12:19:30 -0800164 void verify(const GrPrimitiveProcessor&);
165 void verify(const GrXferProcessor&);
166 void verify(const GrFragmentProcessor&);
cdalton87332102016-02-26 12:22:02 -0800167#endif
egdanielfa896322016-01-13 12:19:30 -0800168
cdalton9c3f1432016-03-11 10:07:37 -0800169 GrGLSLPrimitiveProcessor::TransformsIn fCoordTransforms;
170 GrGLSLPrimitiveProcessor::TransformsOut fOutCoords;
171 int fNumVertexSamplers;
172 int fNumGeometrySamplers;
173 int fNumFragmentSamplers;
egdaniel8dcdedc2015-11-11 06:27:20 -0800174};
175
176#endif