blob: a94099656b9286468ba51fb950d5af2b29f24c7d [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;
egdaniel09aa1fc2016-04-20 07:09:46 -070030 typedef GrGLSLProgramDataManager::UniformHandle SamplerHandle;
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,
dvonbeck9b03e7b2016-08-01 11:01:56 -070045 const char* distanceVectorName,
egdaniel09aa1fc2016-04-20 07:09:46 -070046 const SamplerHandle* texSamplers,
47 const SamplerHandle* bufferSamplers,
joshualitt8072caa2015-02-12 14:20:52 -080048 const TransformsIn& transformsIn,
49 TransformsOut* transformsOut)
egdaniel7ea439b2015-12-03 09:20:44 -080050 : fVertBuilder(vertBuilder)
egdaniel4ca2e602015-11-18 08:01:26 -080051 , fFragBuilder(fragBuilder)
egdaniel0eafe792015-11-20 14:01:22 -080052 , fVaryingHandler(varyingHandler)
egdaniel7ea439b2015-12-03 09:20:44 -080053 , fUniformHandler(uniformHandler)
egdaniela2e3e0f2015-11-19 07:23:45 -080054 , fGLSLCaps(caps)
joshualitt8072caa2015-02-12 14:20:52 -080055 , fGP(gp)
joshualitt8072caa2015-02-12 14:20:52 -080056 , fOutputColor(outputColor)
57 , fOutputCoverage(outputCoverage)
dvonbeck9b03e7b2016-08-01 11:01:56 -070058 , fDistanceVectorName(distanceVectorName)
cdalton3f6f76f2016-04-11 12:18:09 -070059 , fTexSamplers(texSamplers)
cdalton74b8d322016-04-11 14:47:28 -070060 , fBufferSamplers(bufferSamplers)
joshualitt8072caa2015-02-12 14:20:52 -080061 , fTransformsIn(transformsIn)
62 , fTransformsOut(transformsOut) {}
egdaniel4ca2e602015-11-18 08:01:26 -080063 GrGLSLVertexBuilder* fVertBuilder;
cdalton85285412016-02-18 12:37:07 -080064 GrGLSLPPFragmentBuilder* fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080065 GrGLSLVaryingHandler* fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080066 GrGLSLUniformHandler* fUniformHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080067 const GrGLSLCaps* fGLSLCaps;
joshualitt8072caa2015-02-12 14:20:52 -080068 const GrPrimitiveProcessor& fGP;
joshualitt8072caa2015-02-12 14:20:52 -080069 const char* fOutputColor;
70 const char* fOutputCoverage;
dvonbeck9b03e7b2016-08-01 11:01:56 -070071 const char* fDistanceVectorName;
egdaniel09aa1fc2016-04-20 07:09:46 -070072 const SamplerHandle* fTexSamplers;
73 const SamplerHandle* fBufferSamplers;
joshualitt8072caa2015-02-12 14:20:52 -080074 const TransformsIn& fTransformsIn;
75 TransformsOut* fTransformsOut;
76 };
77
78 /**
79 * This is similar to emitCode() in the base class, except it takes a full shader builder.
80 * This allows the effect subclass to emit vertex code.
81 */
82 virtual void emitCode(EmitArgs&) = 0;
83
egdaniele659a582015-11-13 09:55:43 -080084 /** A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
85 produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
joshualitt8072caa2015-02-12 14:20:52 -080086 uploads any uniform variables required by the shaders created in emitCode(). The
87 GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this
egdaniele659a582015-11-13 09:55:43 -080088 GrGLSLPrimitiveProcessor and to have an identical processor key as the one that created this
89 GrGLSLPrimitiveProcessor. */
egdaniel018fb622015-10-28 07:26:40 -070090 virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) = 0;
joshualitt8072caa2015-02-12 14:20:52 -080091
92 static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
93
joshualittd8dd47b2015-09-11 11:45:01 -070094 virtual void setTransformData(const GrPrimitiveProcessor&,
egdaniel018fb622015-10-28 07:26:40 -070095 const GrGLSLProgramDataManager& pdman,
joshualittd8dd47b2015-09-11 11:45:01 -070096 int index,
97 const SkTArray<const GrCoordTransform*, true>& transforms) = 0;
98
joshualitt8072caa2015-02-12 14:20:52 -080099protected:
cdalton85285412016-02-18 12:37:07 -0800100 void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel7ea439b2015-12-03 09:20:44 -0800101 GrGLSLUniformHandler* uniformHandler,
egdaniel8dcdedc2015-11-11 06:27:20 -0800102 const char* outputName,
103 UniformHandle* colorUniform);
joshualitt8072caa2015-02-12 14:20:52 -0800104
joshualitt8072caa2015-02-12 14:20:52 -0800105 struct Transform {
106 Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); }
egdaniel7dc4bd02015-10-29 07:57:01 -0700107 SkMatrix fCurrentValue;
108 GrSLType fType;
joshualitt8072caa2015-02-12 14:20:52 -0800109 };
joshualitt8072caa2015-02-12 14:20:52 -0800110};
111
112#endif