blob: 6f3381f996936df1eea5e4fd9da1701a24918184 [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"
egdaniel018fb622015-10-28 07:26:40 -070012#include "glsl/GrGLSLProgramDataManager.h"
cdalton3f6f76f2016-04-11 12:18:09 -070013#include "glsl/GrGLSLSampler.h"
joshualitt8072caa2015-02-12 14:20:52 -080014
15class GrBatchTracker;
16class GrPrimitiveProcessor;
egdaniela2e3e0f2015-11-19 07:23:45 -080017class GrGLSLCaps;
cdalton85285412016-02-18 12:37:07 -080018class GrGLSLPPFragmentBuilder;
egdaniel8dcdedc2015-11-11 06:27:20 -080019class GrGLSLGPBuilder;
egdaniel7ea439b2015-12-03 09:20:44 -080020class GrGLSLUniformHandler;
egdaniel0eafe792015-11-20 14:01:22 -080021class GrGLSLVaryingHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080022class GrGLSLVertexBuilder;
joshualitt8072caa2015-02-12 14:20:52 -080023
egdaniele659a582015-11-13 09:55:43 -080024class GrGLSLPrimitiveProcessor {
joshualitt8072caa2015-02-12 14:20:52 -080025public:
egdaniele659a582015-11-13 09:55:43 -080026 virtual ~GrGLSLPrimitiveProcessor() {}
joshualitt8072caa2015-02-12 14:20:52 -080027
egdaniel018fb622015-10-28 07:26:40 -070028 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
egdaniel09aa1fc2016-04-20 07:09:46 -070029 typedef GrGLSLProgramDataManager::UniformHandle SamplerHandle;
joshualitt8072caa2015-02-12 14:20:52 -080030
bsalomon56b7dc42016-09-19 09:26:40 -070031 typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords;
32 typedef SkSTArray<8, ProcCoords> TransformsIn;
33 typedef SkSTArray<8, SkTArray<GrShaderVar>> TransformsOut;
joshualitt8072caa2015-02-12 14:20:52 -080034
35 struct EmitArgs {
egdaniel7ea439b2015-12-03 09:20:44 -080036 EmitArgs(GrGLSLVertexBuilder* vertBuilder,
cdalton85285412016-02-18 12:37:07 -080037 GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080038 GrGLSLVaryingHandler* varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -080039 GrGLSLUniformHandler* uniformHandler,
egdaniela2e3e0f2015-11-19 07:23:45 -080040 const GrGLSLCaps* caps,
joshualitt8072caa2015-02-12 14:20:52 -080041 const GrPrimitiveProcessor& gp,
joshualitt8072caa2015-02-12 14:20:52 -080042 const char* outputColor,
43 const char* outputCoverage,
dvonbeck9b03e7b2016-08-01 11:01:56 -070044 const char* distanceVectorName,
egdaniel09aa1fc2016-04-20 07:09:46 -070045 const SamplerHandle* texSamplers,
46 const SamplerHandle* bufferSamplers,
bsalomon56b7dc42016-09-19 09:26:40 -070047 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)
dvonbeck9b03e7b2016-08-01 11:01:56 -070057 , fDistanceVectorName(distanceVectorName)
cdalton3f6f76f2016-04-11 12:18:09 -070058 , fTexSamplers(texSamplers)
cdalton74b8d322016-04-11 14:47:28 -070059 , fBufferSamplers(bufferSamplers)
bsalomon56b7dc42016-09-19 09:26:40 -070060 , fTransformsIn(transformsIn)
61 , fTransformsOut(transformsOut) {}
egdaniel4ca2e602015-11-18 08:01:26 -080062 GrGLSLVertexBuilder* fVertBuilder;
cdalton85285412016-02-18 12:37:07 -080063 GrGLSLPPFragmentBuilder* fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080064 GrGLSLVaryingHandler* fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080065 GrGLSLUniformHandler* fUniformHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080066 const GrGLSLCaps* fGLSLCaps;
joshualitt8072caa2015-02-12 14:20:52 -080067 const GrPrimitiveProcessor& fGP;
joshualitt8072caa2015-02-12 14:20:52 -080068 const char* fOutputColor;
69 const char* fOutputCoverage;
dvonbeck9b03e7b2016-08-01 11:01:56 -070070 const char* fDistanceVectorName;
egdaniel09aa1fc2016-04-20 07:09:46 -070071 const SamplerHandle* fTexSamplers;
72 const SamplerHandle* fBufferSamplers;
bsalomon56b7dc42016-09-19 09:26:40 -070073 const TransformsIn& fTransformsIn;
74 TransformsOut* fTransformsOut;
joshualitt8072caa2015-02-12 14:20:52 -080075 };
76
77 /**
78 * This is similar to emitCode() in the base class, except it takes a full shader builder.
79 * This allows the effect subclass to emit vertex code.
80 */
81 virtual void emitCode(EmitArgs&) = 0;
82
bsalomon56b7dc42016-09-19 09:26:40 -070083 /** A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
84 produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
85 uploads any uniform variables required by the shaders created in emitCode(). The
86 GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this
87 GrGLSLPrimitiveProcessor and to have an identical processor key as the one that created this
88 GrGLSLPrimitiveProcessor. */
89 virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) = 0;
joshualitt8072caa2015-02-12 14:20:52 -080090
91 static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
92
bsalomon56b7dc42016-09-19 09:26:40 -070093 virtual void setTransformData(const GrPrimitiveProcessor&,
94 const GrGLSLProgramDataManager& pdman,
95 int index,
96 const SkTArray<const GrCoordTransform*, true>& transforms) = 0;
97
joshualitt8072caa2015-02-12 14:20:52 -080098protected:
cdalton85285412016-02-18 12:37:07 -080099 void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel7ea439b2015-12-03 09:20:44 -0800100 GrGLSLUniformHandler* uniformHandler,
egdaniel8dcdedc2015-11-11 06:27:20 -0800101 const char* outputName,
102 UniformHandle* colorUniform);
joshualitt8072caa2015-02-12 14:20:52 -0800103};
104
105#endif