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