blob: 4bd5fefd9f4d93c80cbfe75957fc441fe5a04fc9 [file] [log] [blame]
joshualitt8072caa2015-02-12 14:20:52 -08001/*
2 * Copyright 2013 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
egdaniele659a582015-11-13 09:55:43 -08008#ifndef GrGLSLPrimitiveProcessor_DEFINED
9#define GrGLSLPrimitiveProcessor_DEFINED
joshualitt8072caa2015-02-12 14:20:52 -080010
11#include "GrPrimitiveProcessor.h"
egdaniel7dc4bd02015-10-29 07:57:01 -070012#include "glsl/GrGLSLProcessorTypes.h"
egdaniel018fb622015-10-28 07:26:40 -070013#include "glsl/GrGLSLProgramDataManager.h"
cdalton3f6f76f2016-04-11 12:18:09 -070014#include "glsl/GrGLSLSampler.h"
joshualitt8072caa2015-02-12 14:20:52 -080015
16class GrBatchTracker;
17class GrPrimitiveProcessor;
egdaniela2e3e0f2015-11-19 07:23:45 -080018class GrGLSLCaps;
cdalton85285412016-02-18 12:37:07 -080019class GrGLSLPPFragmentBuilder;
egdaniel8dcdedc2015-11-11 06:27:20 -080020class GrGLSLGPBuilder;
egdaniel7ea439b2015-12-03 09:20:44 -080021class GrGLSLUniformHandler;
egdaniel0eafe792015-11-20 14:01:22 -080022class GrGLSLVaryingHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080023class GrGLSLVertexBuilder;
joshualitt8072caa2015-02-12 14:20:52 -080024
egdaniele659a582015-11-13 09:55:43 -080025class GrGLSLPrimitiveProcessor {
joshualitt8072caa2015-02-12 14:20:52 -080026public:
egdaniele659a582015-11-13 09:55:43 -080027 virtual ~GrGLSLPrimitiveProcessor() {}
joshualitt8072caa2015-02-12 14:20:52 -080028
egdaniel018fb622015-10-28 07:26:40 -070029 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
egdanielb8002482016-04-19 15:24:29 -070030 typedef GrGLSLSampler::SamplerArray SamplerArray;
joshualitt8072caa2015-02-12 14:20:52 -080031
32 typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords;
33 typedef SkSTArray<8, ProcCoords> TransformsIn;
egdaniel7dc4bd02015-10-29 07:57:01 -070034 typedef SkSTArray<8, GrGLSLTransformedCoordsArray> TransformsOut;
joshualitt8072caa2015-02-12 14:20:52 -080035
36 struct EmitArgs {
egdaniel7ea439b2015-12-03 09:20:44 -080037 EmitArgs(GrGLSLVertexBuilder* vertBuilder,
cdalton85285412016-02-18 12:37:07 -080038 GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080039 GrGLSLVaryingHandler* varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -080040 GrGLSLUniformHandler* uniformHandler,
egdaniela2e3e0f2015-11-19 07:23:45 -080041 const GrGLSLCaps* caps,
joshualitt8072caa2015-02-12 14:20:52 -080042 const GrPrimitiveProcessor& gp,
joshualitt8072caa2015-02-12 14:20:52 -080043 const char* outputColor,
44 const char* outputCoverage,
egdanielb8002482016-04-19 15:24:29 -070045 const SamplerArray& texSamplers,
46 const SamplerArray& bufferSamplers,
joshualitt8072caa2015-02-12 14:20:52 -080047 const TransformsIn& transformsIn,
48 TransformsOut* transformsOut)
egdaniel7ea439b2015-12-03 09:20:44 -080049 : fVertBuilder(vertBuilder)
egdaniel4ca2e602015-11-18 08:01:26 -080050 , fFragBuilder(fragBuilder)
egdaniel0eafe792015-11-20 14:01:22 -080051 , fVaryingHandler(varyingHandler)
egdaniel7ea439b2015-12-03 09:20:44 -080052 , fUniformHandler(uniformHandler)
egdaniela2e3e0f2015-11-19 07:23:45 -080053 , fGLSLCaps(caps)
joshualitt8072caa2015-02-12 14:20:52 -080054 , fGP(gp)
joshualitt8072caa2015-02-12 14:20:52 -080055 , fOutputColor(outputColor)
56 , fOutputCoverage(outputCoverage)
cdalton3f6f76f2016-04-11 12:18:09 -070057 , fTexSamplers(texSamplers)
cdalton74b8d322016-04-11 14:47:28 -070058 , fBufferSamplers(bufferSamplers)
joshualitt8072caa2015-02-12 14:20:52 -080059 , fTransformsIn(transformsIn)
60 , fTransformsOut(transformsOut) {}
egdaniel4ca2e602015-11-18 08:01:26 -080061 GrGLSLVertexBuilder* fVertBuilder;
cdalton85285412016-02-18 12:37:07 -080062 GrGLSLPPFragmentBuilder* fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080063 GrGLSLVaryingHandler* fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080064 GrGLSLUniformHandler* fUniformHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080065 const GrGLSLCaps* fGLSLCaps;
joshualitt8072caa2015-02-12 14:20:52 -080066 const GrPrimitiveProcessor& fGP;
joshualitt8072caa2015-02-12 14:20:52 -080067 const char* fOutputColor;
68 const char* fOutputCoverage;
egdanielb8002482016-04-19 15:24:29 -070069 const SamplerArray& fTexSamplers;
70 const SamplerArray& fBufferSamplers;
joshualitt8072caa2015-02-12 14:20:52 -080071 const TransformsIn& fTransformsIn;
72 TransformsOut* fTransformsOut;
73 };
74
75 /**
76 * This is similar to emitCode() in the base class, except it takes a full shader builder.
77 * This allows the effect subclass to emit vertex code.
78 */
79 virtual void emitCode(EmitArgs&) = 0;
80
81
egdaniele659a582015-11-13 09:55:43 -080082 /** A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
83 produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
joshualitt8072caa2015-02-12 14:20:52 -080084 uploads any uniform variables required by the shaders created in emitCode(). The
85 GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this
egdaniele659a582015-11-13 09:55:43 -080086 GrGLSLPrimitiveProcessor and to have an identical processor key as the one that created this
87 GrGLSLPrimitiveProcessor. */
egdaniel018fb622015-10-28 07:26:40 -070088 virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) = 0;
joshualitt8072caa2015-02-12 14:20:52 -080089
90 static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
91
joshualittd8dd47b2015-09-11 11:45:01 -070092 virtual void setTransformData(const GrPrimitiveProcessor&,
egdaniel018fb622015-10-28 07:26:40 -070093 const GrGLSLProgramDataManager& pdman,
joshualittd8dd47b2015-09-11 11:45:01 -070094 int index,
95 const SkTArray<const GrCoordTransform*, true>& transforms) = 0;
96
joshualitt8072caa2015-02-12 14:20:52 -080097protected:
cdalton85285412016-02-18 12:37:07 -080098 void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel7ea439b2015-12-03 09:20:44 -080099 GrGLSLUniformHandler* uniformHandler,
egdaniel8dcdedc2015-11-11 06:27:20 -0800100 const char* outputName,
101 UniformHandle* colorUniform);
joshualitt8072caa2015-02-12 14:20:52 -0800102
joshualitt8072caa2015-02-12 14:20:52 -0800103 struct Transform {
104 Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); }
egdaniel7dc4bd02015-10-29 07:57:01 -0700105 UniformHandle fHandle;
106 SkMatrix fCurrentValue;
107 GrSLType fType;
joshualitt8072caa2015-02-12 14:20:52 -0800108 };
109
110 SkSTArray<8, SkSTArray<2, Transform, true> > fInstalledTransforms;
joshualitt8072caa2015-02-12 14:20:52 -0800111};
112
113#endif