blob: f9235db238d5abc0e1c547d08b5d35a474cb8e5d [file] [log] [blame]
tomhudson@google.com168e6342012-04-18 17:49:20 +00001/*
2 * Copyright 2012 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
bsalomon@google.com422e81a2012-10-25 14:11:03 +00008#ifndef GrGLEffect_DEFINED
9#define GrGLEffect_DEFINED
tomhudson@google.com168e6342012-04-18 17:49:20 +000010
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +000011#include "GrBackendEffectFactory.h"
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +000012#include "GrGLProgramEffects.h"
tomhudson@google.com168e6342012-04-18 17:49:20 +000013#include "GrGLShaderVar.h"
14#include "GrGLSL.h"
tomhudson@google.com168e6342012-04-18 17:49:20 +000015
bsalomon848faf02014-07-11 10:01:02 -070016class GrGLShaderBuilder;
17
tomhudson@google.com168e6342012-04-18 17:49:20 +000018/** @file
bsalomon@google.com374e7592012-10-23 17:30:45 +000019 This file contains specializations for OpenGL of the shader stages declared in
bsalomon@google.comd698f772012-10-25 13:22:00 +000020 include/gpu/GrEffect.h. Objects of type GrGLEffect are responsible for emitting the
bsalomon@google.com77af6802013-10-02 13:04:56 +000021 GLSL code that implements a GrEffect and for uploading uniforms at draw time. If they don't
22 always emit the same GLSL code, they must have a function:
bsalomon63e99f72014-07-21 08:03:14 -070023 static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*)
bsalomon@google.com8ea78d82012-10-24 20:11:30 +000024 that is used to implement a program cache. When two GrEffects produce the same key this means
bsalomon@google.com422e81a2012-10-25 14:11:03 +000025 that their GrGLEffects would emit the same GLSL code.
tomhudson@google.com168e6342012-04-18 17:49:20 +000026
bsalomon@google.comc7818882013-03-20 19:19:53 +000027 The GrGLEffect subclass must also have a constructor of the form:
28 EffectSubclass::EffectSubclass(const GrBackendEffectFactory&, const GrDrawEffect&)
29 The effect held by the GrDrawEffect is guaranteed to be of the type that generated the
30 GrGLEffect subclass instance.
31
bsalomon@google.coma469c282012-10-24 18:28:34 +000032 These objects are created by the factory object returned by the GrEffect::getFactory().
tomhudson@google.com168e6342012-04-18 17:49:20 +000033*/
34
bsalomon@google.comc7818882013-03-20 19:19:53 +000035class GrDrawEffect;
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000036class GrGLTexture;
37class GrGLVertexEffect;
bsalomon@google.comc7818882013-03-20 19:19:53 +000038
bsalomon@google.comd698f772012-10-25 13:22:00 +000039class GrGLEffect {
tomhudson@google.com168e6342012-04-18 17:49:20 +000040
41public:
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +000042 typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray;
commit-bot@chromium.org907fbd52013-12-09 17:03:02 +000043 typedef GrGLProgramEffects::TextureSampler TextureSampler;
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +000044 typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray;
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +000045
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000046 GrGLEffect(const GrBackendEffectFactory& factory)
47 : fFactory(factory)
48 , fIsVertexEffect(false) {
49 }
bsalomon@google.comf06df1b2012-09-06 20:22:31 +000050
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +000051 virtual ~GrGLEffect() {}
tomhudson@google.comd8f856c2012-05-10 12:13:36 +000052
bsalomon@google.com374e7592012-10-23 17:30:45 +000053 /** Called when the program stage should insert its code into the shaders. The code in each
54 shader will be in its own block ({}) and so locally scoped names will not collide across
55 stages.
tomhudson@google.com6a820b62012-05-24 15:10:14 +000056
bsalomon@google.com374e7592012-10-23 17:30:45 +000057 @param builder Interface used to emit code in the shaders.
bsalomon@google.comc7818882013-03-20 19:19:53 +000058 @param drawEffect A wrapper on the effect that generated this program stage.
bsalomon@google.comd8b5fac2012-11-01 17:02:46 +000059 @param key The key that was computed by GenKey() from the generating GrEffect.
bsalomon@google.com374e7592012-10-23 17:30:45 +000060 @param outputColor A predefined vec4 in the FS in which the stage should place its output
61 color (or coverage).
62 @param inputColor A vec4 that holds the input color to the stage in the FS. This may be
63 NULL in which case the implied input is solid white (all ones).
64 TODO: Better system for communicating optimization info (e.g. input
65 color is solid white, trans black, known to be opaque, etc.) that allows
bsalomon@google.comf271cc72012-10-24 19:35:13 +000066 the effect to communicate back similar known info about its output.
bsalomon@google.coma469c282012-10-24 18:28:34 +000067 @param samplers One entry for each GrTextureAccess of the GrEffect that generated the
bsalomon@google.comd698f772012-10-25 13:22:00 +000068 GrGLEffect. These can be passed to the builder to emit texture
bsalomon@google.com374e7592012-10-23 17:30:45 +000069 reads in the generated code.
bsalomon@google.comd4726202012-08-03 14:34:46 +000070 */
bsalomon@google.com374e7592012-10-23 17:30:45 +000071 virtual void emitCode(GrGLShaderBuilder* builder,
bsalomon@google.comc7818882013-03-20 19:19:53 +000072 const GrDrawEffect& drawEffect,
bsalomon63e99f72014-07-21 08:03:14 -070073 const GrEffectKey& key,
bsalomon@google.com374e7592012-10-23 17:30:45 +000074 const char* outputColor,
75 const char* inputColor,
bsalomon@google.com77af6802013-10-02 13:04:56 +000076 const TransformedCoordsArray& coords,
bsalomon@google.com374e7592012-10-23 17:30:45 +000077 const TextureSamplerArray& samplers) = 0;
tomhudson@google.com168e6342012-04-18 17:49:20 +000078
bsalomon@google.comd698f772012-10-25 13:22:00 +000079 /** A GrGLEffect instance can be reused with any GrEffect that produces the same stage
bsalomon63e99f72014-07-21 08:03:14 -070080 key; this function reads data from a GrEffect and uploads any uniform variables required
81 by the shaders created in emitCode(). The GrEffect installed in the GrDrawEffect is
bsalomon@google.com28a15fb2012-10-26 17:53:18 +000082 guaranteed to be of the same type that created this GrGLEffect and to have an identical
bsalomon63e99f72014-07-21 08:03:14 -070083 effect key as the one that created this GrGLEffect. Effects that use local coords have
bsalomon@google.comc7818882013-03-20 19:19:53 +000084 to consider whether the GrEffectStage's coord change matrix should be used. When explicit
85 local coordinates are used it can be ignored. */
commit-bot@chromium.org3390b9a2013-10-03 15:17:58 +000086 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) {}
tomhudson@google.com168e6342012-04-18 17:49:20 +000087
bsalomon@google.com289efe02012-05-21 20:57:59 +000088 const char* name() const { return fFactory.name(); }
89
bsalomon63e99f72014-07-21 08:03:14 -070090 static void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*) {}
bsalomon@google.com77af6802013-10-02 13:04:56 +000091
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000092 /** Used by the system when generating shader code, to see if this effect can be downcasted to
93 the internal GrGLVertexEffect type */
94 bool isVertexEffect() const { return fIsVertexEffect; }
95
tomhudson@google.com07eecdc2012-04-20 18:35:38 +000096protected:
bsalomon@google.com396e61f2012-10-25 19:00:29 +000097 const GrBackendEffectFactory& fFactory;
commit-bot@chromium.org261dc562013-10-04 15:42:56 +000098
99private:
100 friend class GrGLVertexEffect; // to set fIsVertexEffect
101
102 bool fIsVertexEffect;
tomhudson@google.com168e6342012-04-18 17:49:20 +0000103};
104
tomhudson@google.com168e6342012-04-18 17:49:20 +0000105#endif