GrGLProcessor.h revision 3390b9ac9ad69a6e772c2b957d75d19611239025
13390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org/* 23390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Copyright 2013 Google Inc. 33390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * 43390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 53390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * found in the LICENSE file. 63390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 73390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 83390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#ifndef GrGLProgramEffects_DEFINED 93390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#define GrGLProgramEffects_DEFINED 103390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 113390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#include "GrBackendEffectFactory.h" 123390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#include "GrTexture.h" 133390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#include "GrTextureAccess.h" 143390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#include "GrGLUniformManager.h" 153390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 163390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrEffectStage; 173390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLProgramEffectsBuilder; 183390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLShaderBuilder; 193390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 203390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org/** 213390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * This class encapsulates an array of GrGLEffects and their supporting data (coord transforms 223390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * and textures). It is built with GrGLProgramEffectsBuilder, then used to manage the necessary GL 233390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * state and shader uniforms. 243390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 253390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLProgramEffects { 263390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgpublic: 273390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org typedef GrBackendEffectFactory::EffectKey EffectKey; 283390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org typedef GrGLUniformManager::UniformHandle UniformHandle; 293390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 303390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 313390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * These methods generate different portions of an effect's final key. 323390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 333390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org static EffectKey GenAttribKey(const GrDrawEffect&); 343390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org static EffectKey GenTransformKey(const GrDrawEffect&); 353390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org static EffectKey GenTextureKey(const GrDrawEffect&, const GrGLCaps&); 363390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 373390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org ~GrGLProgramEffects(); 383390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 393390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 403390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Assigns a texture unit to each sampler. It starts on *texUnitIdx and writes the next 413390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * available unit to *texUnitIdx when it returns. 423390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 433390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void initSamplers(const GrGLUniformManager&, int* texUnitIdx); 443390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 453390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 463390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Calls setData() on each effect, and sets their transformation matrices and texture bindings. 473390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 483390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void setData(GrGpuGL*, 493390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const GrGLUniformManager&, 503390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const GrEffectStage* effectStages[]); 513390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 523390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 533390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Passed to GrGLEffects so they can add transformed coordinates to their shader code. 543390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 553390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org class TransformedCoords { 563390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org public: 573390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org TransformedCoords(const char* name, GrSLType type, const char* vsName) 583390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org : fName(name), fType(type), fVSName(vsName) { 593390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org } 603390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 613390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* c_str() const { return fName.c_str(); } 623390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrSLType type() const { return fType; } 633390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const SkString& getName() const { return fName; } 643390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org // TODO: Remove the VS name when we have vertexless shaders, and gradients are reworked. 653390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const SkString& getVSName() const { return fVSName; } 663390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 673390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org private: 683390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkString fName; 693390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrSLType fType; 703390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkString fVSName; 713390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org }; 723390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 733390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org typedef SkTArray<TransformedCoords> TransformedCoordsArray; 743390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 753390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 763390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Passed to GrGLEffects so they can add texture reads to their shader code. 773390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 783390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org class TextureSampler { 793390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org public: 803390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org TextureSampler(UniformHandle uniform, const GrTextureAccess& access) 813390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org : fSamplerUniform(uniform) 823390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org , fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) { 833390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkASSERT(0 != fConfigComponentMask); 843390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org memcpy(fSwizzle, access.getSwizzle(), 5); 853390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org } 863390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 873390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org UniformHandle samplerUniform() const { return fSamplerUniform; } 883390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org // bitfield of GrColorComponentFlags present in the texture's config. 893390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org uint32_t configComponentMask() const { return fConfigComponentMask; } 903390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* swizzle() const { return fSwizzle; } 913390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 923390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org private: 933390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org UniformHandle fSamplerUniform; 943390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org uint32_t fConfigComponentMask; 953390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org char fSwizzle[5]; 963390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org }; 973390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 983390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org typedef SkTArray<TextureSampler> TextureSamplerArray; 993390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1003390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgprivate: 1013390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org friend class GrGLProgramEffectsBuilder; 1023390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1033390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects(int reserveCount, bool explicitLocalCoords) 1043390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org : fGLEffects(reserveCount) 1053390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org , fTransforms(reserveCount) 1063390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org , fSamplers(reserveCount) 1073390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org , fHasExplicitLocalCoords(explicitLocalCoords) { 1083390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org } 1093390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1103390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1113390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Helper for setData(). Sets all the transform matrices for an effect. 1123390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1133390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void setTransformData(const GrGLUniformManager&, const GrDrawEffect&, int effectIdx); 1143390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1153390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1163390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Helper for setData(). Binds all the textures for an effect. 1173390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1183390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void bindTextures(GrGpuGL*, const GrEffectRef&, int effectIdx); 1193390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1203390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org struct Transform { 1213390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org Transform() { fCurrentValue = SkMatrix::InvalidMatrix(); } 1223390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org UniformHandle fHandle; 1233390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrSLType fType; 1243390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkMatrix fCurrentValue; 1253390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org }; 1263390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1273390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org struct Sampler { 1283390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkDEBUGCODE(Sampler() : fTextureUnit(-1) {}) 1293390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org UniformHandle fUniform; 1303390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org int fTextureUnit; 1313390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org }; 1323390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1333390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkTArray<GrGLEffect*> fGLEffects; 1343390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkTArray<SkSTArray<2, Transform, true> > fTransforms; 1353390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkTArray<SkSTArray<4, Sampler, true> > fSamplers; 1363390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org bool fHasExplicitLocalCoords; 1373390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org}; 1383390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1393390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////// 1403390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1413390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org/** 1423390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * This class is used to construct a GrGLProgramEffects. 1433390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1443390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLProgramEffectsBuilder { 1453390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgpublic: 1463390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffectsBuilder(GrGLShaderBuilder* builder, int reserveCount); 1473390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1483390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1493390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Emits the effect's shader code, and stores the necessary uniforms internally. 1503390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1513390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void emitEffect(const GrEffectStage&, 1523390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects::EffectKey, 1533390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* outColor, 1543390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org const char* inColor, 1553390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org int stageIndex); 1563390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1573390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1583390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Finalizes the building process and returns the effect array. After this call, the builder 1593390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * becomes invalid. 1603390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1613390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects* finish() { return fProgramEffects.detach(); } 1623390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1633390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgprivate: 1643390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1653390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Helper for emitEffect(). Emits any attributes an effect might have. 1663390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1673390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void emitAttributes(const GrEffectStage&); 1683390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1693390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1703390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Helper for emitEffect(). Emits code to implement an effect's coord transforms in the VS. 1713390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Varyings are added as an outputs of the VS and inputs to the FS. The varyings may be either a 1723390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * vec2f or vec3f depending upon whether perspective interpolation is required or not. The names 1733390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * of the varyings in the VS and FS as well their types are appended to the 1743390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * TransformedCoordsArray* object, which is in turn passed to the effect's emitCode() function. 1753390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1763390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void emitTransforms(const GrEffectRef&, 1773390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects::EffectKey, 1783390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects::TransformedCoordsArray*); 1793390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1803390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org /** 1813390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * Helper for emitEffect(). Emits uniforms for an effect's texture accesses. The uniform info 1823390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * as well as texture access parameters are appended to the TextureSamplerArray* object, which 1833390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org * is in turn passed to the effect's emitCode() function. 1843390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org */ 1853390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org void emitSamplers(const GrEffectRef&, 1863390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLProgramEffects::TextureSamplerArray*); 1873390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1883390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org GrGLShaderBuilder* fBuilder; 1893390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org SkAutoTDelete<GrGLProgramEffects> fProgramEffects; 1903390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org}; 1913390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org 1923390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.org#endif 193