187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */
887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#ifndef GrGpuGLShaders_DEFINED
1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#define GrGpuGLShaders_DEFINED
1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "GrGpuGL.h"
1587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "GrGLProgram.h"
1687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerclass GrGpuGLProgram;
1887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger// Programmable OpenGL or OpenGL ES 2.0
2087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerclass GrGpuGLShaders : public GrGpuGL {
2187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerpublic:
224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger             GrGpuGLShaders(const GrGLContextInfo& ctxInfo);
2387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual ~GrGpuGLShaders();
2487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
250199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger    virtual void abandonResources();
260199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool programUnitTest();
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprotected:
3087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // overrides from GrGpu
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onResetContext() SK_OVERRIDE;
3287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual bool flushGraphicsState(GrPrimitiveType type);
3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual void setupGeometry(int* startVertex,
3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                               int* startIndex,
3587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                               int vertexCount,
3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                               int indexCount);
3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual void postDraw();
3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprivate:
4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // for readability of function impls
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GrGLProgram::ProgramDesc ProgramDesc;
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef ProgramDesc::StageDesc   StageDesc;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GrGLProgram::CachedData  CachedData;
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    class ProgramCache;
4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // Helpers to make code more readable
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrMatrix& getHWViewMatrix();
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void recordHWViewMatrix(const GrMatrix& matrix);
5187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const GrMatrix& getHWSamplerMatrix(int stage);
5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    void recordHWSamplerMatrix(int stage, const GrMatrix& matrix);
5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
5487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // sets the texture matrix uniform for currently bound program
5587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    void flushTextureMatrix(int stage);
5687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // sets the texture domain uniform for currently bound program
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void flushTextureDomain(int stage);
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // sets the color specified by GrDrawState::setColor()
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void flushColor(GrColor color);
6235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // sets the color specified by GrDrawState::setCoverage()
644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    void flushCoverage(GrColor color);
654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
6687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // sets the MVP matrix uniform for currently bound program
6787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    void flushViewMatrix();
6887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
6987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    // flushes the parameters to two point radial gradient
7087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    void flushRadial2(int stage);
7187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // flushes the parameters for convolution
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void flushConvolution(int stage);
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // flushes the normalized texel size
7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    void flushTexelSize(int stage);
7735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
7835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    // flushes the edges for edge AA
7935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    void flushEdgeAAData();
8035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // flushes the color matrix
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void flushColorMatrix();
8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static void DeleteProgram(const GrGLInterface* gl,
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              CachedData* programData);
8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void buildProgram(GrPrimitiveType typeBlend,
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                      BlendOptFlags blendOpts,
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                      GrBlendCoeff dstCoeff);
9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    ProgramCache*               fProgramCache;
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    CachedData*                 fProgramData;
9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrGLuint                    fHWProgramID;
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    GrGLProgram                 fCurrentProgram;
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // If we get rid of fixed function subclass this should move
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // to the GLCaps struct in parent class
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint                     fMaxVertexAttribs;
9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    typedef GrGpuGL INHERITED;
10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#endif
10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
104