1363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 2363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Copyright 2012 Google Inc. 3363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * 4363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * found in the LICENSE file. 6363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 7363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 8363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifndef GrGLEffect_DEFINED 9363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#define GrGLEffect_DEFINED 10363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 11363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrBackendEffectFactory.h" 120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "GrGLProgramEffects.h" 13363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrGLShaderBuilder.h" 14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrGLShaderVar.h" 15363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "GrGLSL.h" 16363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 17363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/** @file 18363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger This file contains specializations for OpenGL of the shader stages declared in 19363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger include/gpu/GrEffect.h. Objects of type GrGLEffect are responsible for emitting the 200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GLSL code that implements a GrEffect and for uploading uniforms at draw time. If they don't 210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger always emit the same GLSL code, they must have a function: 22e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) 23363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger that is used to implement a program cache. When two GrEffects produce the same key this means 24363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger that their GrGLEffects would emit the same GLSL code. 25363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger The GrGLEffect subclass must also have a constructor of the form: 27e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger EffectSubclass::EffectSubclass(const GrBackendEffectFactory&, const GrDrawEffect&) 28e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger The effect held by the GrDrawEffect is guaranteed to be of the type that generated the 29e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger GrGLEffect subclass instance. 30e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger 31363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger These objects are created by the factory object returned by the GrEffect::getFactory(). 32363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger*/ 33363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 34e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenbergerclass GrDrawEffect; 350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerclass GrGLTexture; 360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerclass GrGLVertexEffect; 37e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger 38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass GrGLEffect { 39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef GrBackendEffectFactory::EffectKey EffectKey; 420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray; 43910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger typedef GrGLProgramEffects::TextureSampler TextureSampler; 440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray; 45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger enum { 47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kNoEffectKey = GrBackendEffectFactory::kNoEffectKey, 48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger // the number of bits in EffectKey available to GenKey 49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger kEffectKeyBits = GrBackendEffectFactory::kEffectKeyBits, 50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GrGLEffect(const GrBackendEffectFactory& factory) 530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger : fFactory(factory) 540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger , fIsVertexEffect(false) { 550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger } 56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual ~GrGLEffect() {} 58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** Called when the program stage should insert its code into the shaders. The code in each 60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger shader will be in its own block ({}) and so locally scoped names will not collide across 61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger stages. 62363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 63363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger @param builder Interface used to emit code in the shaders. 64e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger @param drawEffect A wrapper on the effect that generated this program stage. 65363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger @param key The key that was computed by GenKey() from the generating GrEffect. 66363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger Only the bits indicated by GrBackendEffectFactory::kEffectKeyBits are 67363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger guaranteed to match the value produced by GenKey(); 68363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger @param outputColor A predefined vec4 in the FS in which the stage should place its output 69363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger color (or coverage). 70363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger @param inputColor A vec4 that holds the input color to the stage in the FS. This may be 71363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger NULL in which case the implied input is solid white (all ones). 72363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger TODO: Better system for communicating optimization info (e.g. input 73363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger color is solid white, trans black, known to be opaque, etc.) that allows 74363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger the effect to communicate back similar known info about its output. 75363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger @param samplers One entry for each GrTextureAccess of the GrEffect that generated the 76363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger GrGLEffect. These can be passed to the builder to emit texture 77363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger reads in the generated code. 78363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 79363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual void emitCode(GrGLShaderBuilder* builder, 80e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger const GrDrawEffect& drawEffect, 81363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger EffectKey key, 82363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const char* outputColor, 83363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const char* inputColor, 840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger const TransformedCoordsArray& coords, 85363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const TextureSamplerArray& samplers) = 0; 86363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 87363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger /** A GrGLEffect instance can be reused with any GrEffect that produces the same stage 88363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger key; this function reads data from a stage and uploads any uniform variables required 89363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger by the shaders created in emitCode(). The GrEffect installed in the GrEffectStage is 90363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger guaranteed to be of the same type that created this GrGLEffect and to have an identical 91e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger EffectKey as the one that created this GrGLEffect. Effects that use local coords have 92e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger to consider whether the GrEffectStage's coord change matrix should be used. When explicit 93e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger local coordinates are used it can be ignored. */ 940a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) {} 95363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 96363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const char* name() const { return fFactory.name(); } 97363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 980a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { return 0; } 990a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1000a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** Used by the system when generating shader code, to see if this effect can be downcasted to 1010a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger the internal GrGLVertexEffect type */ 1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool isVertexEffect() const { return fIsVertexEffect; } 103363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 104363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 105363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger const GrBackendEffectFactory& fFactory; 1060a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1070a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerprivate: 1080a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger friend class GrGLVertexEffect; // to set fIsVertexEffect 1090a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 1100a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool fIsVertexEffect; 111363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 112363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 113363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 114