GrGLProgram.h revision 30ba436f04e61d4505fb854d5fc56079636e0788
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 7f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 9f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#ifndef GrGLProgram_DEFINED 10f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#define GrGLProgram_DEFINED 11f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 1230ba436f04e61d4505fb854d5fc56079636e0788joshualitt#include "builders/GrGLProgramBuilder.h" 13d8f856c32b679d9f5a9926feac005e2c0186f83ftomhudson@google.com#include "GrDrawState.h" 146177e6999d23a4268ffd98dedfb1da00e272a89brobertphillips@google.com#include "GrGLContext.h" 1531ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com#include "GrGLProgramDesc.h" 16086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h" 17890e3b58e78c0825820f75f1f0c5a5d71e855aa6bsalomon@google.com#include "GrGLTexture.h" 187510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen#include "GrGLProgramDataManager.h" 19f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 20f0a104e6f16dc095286d32f1e104894ae0b2b19fbsalomon@google.com#include "SkString.h" 2197c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo#include "SkXfermode.h" 2297c88c255cff3dbb8343c5d090526fdbedad6dd6Scroggo 23d698f77c13d97c61109b861eac4d25b14a5de935bsalomon@google.comclass GrGLEffect; 243390b9ac9ad69a6e772c2b957d75d19611239025commit-bot@chromium.orgclass GrGLProgramEffects; 2530ba436f04e61d4505fb854d5fc56079636e0788joshualittclass GrGLProgramBuilder; 26f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 27f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com/** 28f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * This class manages a GPU program and records per-program information. 29f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * We can specify the attribute locations so that they are constant 30f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * across our shaders. But the driver determines the uniform locations 31f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * at link time. We don't need to remember the sampler uniform location 32f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * because we will bind a texture slot to it and never change it 33f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * Uniforms are program-local so we can't rely on fHWState to hold the 34f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com * previous uniform state after a program change. 35f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 36a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.orgclass GrGLProgram : public SkRefCnt { 37f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.compublic: 389ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com SK_DECLARE_INST_COUNT(GrGLProgram) 394fa6694c587b3830932429766c99d08c8dd9b723bsalomon@google.com 4030ba436f04e61d4505fb854d5fc56079636e0788joshualitt typedef GrGLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles; 41dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen 429188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org static GrGLProgram* Create(GrGpuGL* gpu, 4331ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com const GrGLProgramDesc& desc, 442c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com const GrEffectStage* colorStages[], 452c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com const GrEffectStage* coverageStages[]); 46ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 479ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com virtual ~GrGLProgram(); 48f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 4934cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com /** 5034cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com * Call to abandon GL objects owned by this program. 5134cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com */ 52ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void abandon(); 53ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com 54f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com /** 552db3ded335fdb6697623bece61cabc307a414770bsalomon@google.com * The shader may modify the blend coefficients. Params are in/out. 56f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com */ 57ecb60aad5c6fe5b1dbcfc86ac00bfc9326103c8dbsalomon@google.com void overrideBlend(GrBlendCoeff* srcCoeff, GrBlendCoeff* dstCoeff) const; 58f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 5931ec7985f2b52a0cab4aa714a613b918cf663c08bsalomon@google.com const GrGLProgramDesc& getDesc() { return fDesc; } 609ba4fa6f0fb8ef496d81ccac36e780aa806fea83bsalomon@google.com 61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com /** 626a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * Gets the GL program ID for this program. 636a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com */ 64dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen GrGLuint programID() const { return fProgramID; } 656a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 66dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen bool hasVertexShader() const { return fHasVertexShader; } 676b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 686a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com /** 69054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com * Some GL state that is relevant to programs is not stored per-program. In particular color 7005a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com * and coverage attributes can be global state. This struct is read and updated by 7105a2ee052c9ef4c781b7b590b00b3d2da3b3449askia.committer@gmail.com * GrGLProgram::setColor and GrGLProgram::setCoverage to allow us to avoid setting this state 72054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com * redundantly. 7391207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com */ 7491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com struct SharedGLState { 7591207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com GrColor fConstAttribColor; 76054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com int fConstAttribColorIndex; 7791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com GrColor fConstAttribCoverage; 78054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com int fConstAttribCoverageIndex; 7991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com 8091207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com SharedGLState() { this->invalidate(); } 8191207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com void invalidate() { 8291207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com fConstAttribColor = GrColor_ILLEGAL; 83054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com fConstAttribColorIndex = -1; 8491207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com fConstAttribCoverage = GrColor_ILLEGAL; 85054ae99d93711c26e40682a0e3a03a47ea605c53jvanverth@google.com fConstAttribCoverageIndex = -1; 8691207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com } 8791207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com }; 8891207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com 8991207482c9398944fc997aeb99ed5f8674be58cbbsalomon@google.com /** 906a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * The GrDrawState's view matrix along with the aspects of the render target determine the 916a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * matrix sent to GL. The size of the render target affects the GL matrix because we must 926a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * convert from Skia device coords to GL's normalized coords. Also the origin of the render 936a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com * target may require us to perform a mirror-flip. 946a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com */ 956a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com struct MatrixState { 966a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com SkMatrix fViewMatrix; 976a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com SkISize fRenderTargetSize; 986a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com GrSurfaceOrigin fRenderTargetOrigin; 996a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 1006a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com MatrixState() { this->invalidate(); } 1016a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com void invalidate() { 1026a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com fViewMatrix = SkMatrix::InvalidMatrix(); 10345a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com fRenderTargetSize.fWidth = -1; 10445a412ee365694c61b50f6177382b509d1e2462bbsalomon@google.com fRenderTargetSize.fHeight = -1; 1056a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com fRenderTargetOrigin = (GrSurfaceOrigin) -1; 1066a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com } 10747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 10847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org /** 10947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * Gets a matrix that goes from local coords to Skia's device coordinates. 11047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org */ 111215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org template<int Size> void getGLMatrix(GrGLfloat* destMatrix) { 11247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org GrGLGetMatrix<Size>(destMatrix, fViewMatrix); 11347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } 11447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 11547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org /** 11647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * Gets a matrix that goes from local coordinates to GL normalized device coords. 11747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org */ 11847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org template<int Size> void getRTAdjustedGLMatrix(GrGLfloat* destMatrix) { 119215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org SkMatrix combined; 120215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) { 121215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1, 122215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org 0, -SkIntToScalar(2) / fRenderTargetSize.fHeight, SK_Scalar1, 12347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 0, 0, 1); 124215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org } else { 125215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org combined.setAll(SkIntToScalar(2) / fRenderTargetSize.fWidth, 0, -SK_Scalar1, 126215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org 0, SkIntToScalar(2) / fRenderTargetSize.fHeight, -SK_Scalar1, 12747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 0, 0, 1); 128215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org } 129b930cc3dcb0645a8ce0689c5feb9c0defda57f28commit-bot@chromium.org combined.preConcat(fViewMatrix); 130215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org GrGLGetMatrix<Size>(destMatrix, combined); 131215a682d2d561be69b7a28eb76a98849ad03cbc0commit-bot@chromium.org } 13247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org 13347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org /** 13447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * Gets a vec4 that adjusts the position from Skia device coords to GL's normalized device 13547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * coords. Assuming the transformed position, pos, is a homogeneous vec3, the vec, v, is 13647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * applied as such: 13747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * pos.x = dot(v.xy, pos.xz) 13847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org * pos.y = dot(v.zq, pos.yz) 13947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org */ 14047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org void getRTAdjustmentVec(GrGLfloat* destVec) { 14147c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[0] = 2.f / fRenderTargetSize.fWidth; 14247c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[1] = -1.f; 14347c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) { 14447c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[2] = -2.f / fRenderTargetSize.fHeight; 14547c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[3] = 1.f; 14647c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } else { 14747c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[2] = 2.f / fRenderTargetSize.fHeight; 14847c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org destVec[3] = -1.f; 14947c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } 15047c66ddaeb48faf963a2ef3f508a7d816e4168cccommit-bot@chromium.org } 1516a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com }; 1526a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com 1536a51dcbf81cff6d92996ab3f4c7457478e441896bsalomon@google.com /** 15434cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com * This function uploads uniforms and calls each GrGLEffect's setData. It is called before a 15534cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com * draw occurs using the program after the program has already been bound. It also uses the 1562c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com * GrGpuGL object to bind the textures required by the GrGLEffects. The color and coverage 1572c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com * stages come from GrGLProgramDesc::Build(). 1584285accf5af574e6c826d5d09f0359c6149fd717bsalomon@google.com */ 1599188a15f846ae79892c332aed2a72ee38116bdc6commit-bot@chromium.org void setData(GrDrawState::BlendOptFlags, 1602c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com const GrEffectStage* colorStages[], 1612c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com const GrEffectStage* coverageStages[], 16226e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com const GrDeviceCoordTexture* dstCopy, // can be NULL 16326e18b593ab65e4d92dfbce92579d8bc180d4c2cbsalomon@google.com SharedGLState*); 1649196130af83782fcac4334117142475a837dd74dbsalomon@google.com 1652a2e3ef5b84de3347aedaf1f7dd93cfcdb53d7f1tomhudson@google.comprivate: 1667510b224e52b9518a8ddf7418db0e9c258f79539kkinnunen typedef GrGLProgramDataManager::UniformHandle UniformHandle; 167dbbc4e2da93cef5c0cfb0b3c92ff6c2c80f6e67absalomon@google.com 168a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org GrGLProgram(GrGpuGL*, 169a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org const GrGLProgramDesc&, 17030ba436f04e61d4505fb854d5fc56079636e0788joshualitt const GrGLProgramBuilder&); 1712c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 172a05fa0669bac20e521ac3c1905fe8391fd659e60commit-bot@chromium.org // Sets the texture units for samplers. 1732c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com void initSamplerUniforms(); 1742c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 1752c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // Helper for setData(). Makes GL calls to specify the initial color when there is not 1762c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // per-vertex colors. 1772c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com void setColor(const GrDrawState&, GrColor color, SharedGLState*); 1782c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 1792c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // Helper for setData(). Makes GL calls to specify the initial coverage when there is not 1802c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // per-vertex coverages. 1812c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com void setCoverage(const GrDrawState&, GrColor coverage, SharedGLState*); 1822c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 1832c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com // Helper for setData() that sets the view matrix and loads the render target height uniform 1842c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com void setMatrixAndRenderTargetHeight(const GrDrawState&); 1852c84aa35988c661b3e5513c8ba9b3959832ff288bsalomon@google.com 18634cccde630fc618649b9737bee464203d042bfbbbsalomon@google.com // these reflect the current values of uniforms (GL uniform values travel with program) 1876eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org MatrixState fMatrixState; 1886eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrColor fColor; 1896eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrColor fCoverage; 1906eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org int fDstCopyTexUnit; 1916eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org 192dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen BuiltinUniformHandles fBuiltinUniformHandles; 193dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen SkAutoTUnref<GrGLProgramEffects> fColorEffects; 194dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen SkAutoTUnref<GrGLProgramEffects> fCoverageEffects; 195dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen GrGLuint fProgramID; 196dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen bool fHasVertexShader; 197dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen int fTexCoordSetCnt; 1989681eebb0e441cee25b6faac82c3728512acda27skia.committer@gmail.com 1996eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrGLProgramDesc fDesc; 2006eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org GrGpuGL* fGpu; 2016eac42e3ab68b085117d7f91621276a722b5a3a7commit-bot@chromium.org 202dddc18a6bba67ad43a65f4c244b95f76cefef617kkinnunen GrGLProgramDataManager fProgramDataManager; 2036b30e457409f37c91c301cd82040e733e2930286commit-bot@chromium.org 204a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org typedef SkRefCnt INHERITED; 205f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com}; 206f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com 207f93e717c7f7ca679a80acbfda6a34013ae1e2b8djunov@google.com#endif 208