11cab2921ab279367f8206cdadc9259d12e603548Derek 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.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGpuGL.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGLStencilBuffer.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrTypes.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTemplates.h"
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrGLuint GR_MAX_GLUINT = ~0;
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrGLint  GR_INVAL_GLINT = ~0;
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X)
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// we use a spare texture unit to avoid
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// mucking with the state of any of the stages.
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const int SPARE_TEX_UNIT = GrDrawState::kNumStages;
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SKIP_CACHE_CHECK    true
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#if GR_GL_CHECK_ALLOC_WITH_GET_ERROR
284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define CLEAR_ERROR_BEFORE_ALLOC(iface)   GrGLClearErr(iface)
294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define GL_ALLOC_CALL(iface, call)        GR_GL_CALL_NOERRCHECK(iface, call)
304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define CHECK_ALLOC_ERROR(iface)          GR_GL_GET_ERROR(iface)
314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#else
324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define CLEAR_ERROR_BEFORE_ALLOC(iface)
334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define GL_ALLOC_CALL(iface, call)        GR_GL_CALL(iface, call)
344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    #define CHECK_ALLOC_ERROR(iface)          GR_GL_NO_ERROR
354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#endif
364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrGLenum gXfermodeCoeff2Blend[] = {
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ZERO,
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE,
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_SRC_COLOR,
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_SRC_COLOR,
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_DST_COLOR,
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_DST_COLOR,
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_SRC_ALPHA,
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_SRC_ALPHA,
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_DST_ALPHA,
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_DST_ALPHA,
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CONSTANT_COLOR,
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_CONSTANT_COLOR,
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CONSTANT_ALPHA,
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_CONSTANT_ALPHA,
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // extended blend coeffs
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_SRC1_COLOR,
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_SRC1_COLOR,
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_SRC1_ALPHA,
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ONE_MINUS_SRC1_ALPHA,
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::BlendCoeffReferencesConstant(GrBlendCoeff coeff) {
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const bool gCoeffReferencesBlendConst[] = {
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        true,
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        true,
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        true,
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        true,
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // extended blend coeffs
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        false,
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return gCoeffReferencesBlendConst[coeff];
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(kTotalBlendCoeffCount == GR_ARRAY_COUNT(gCoeffReferencesBlendConst));
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(0 == kZero_BlendCoeff);
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(1 == kOne_BlendCoeff);
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(2 == kSC_BlendCoeff);
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(3 == kISC_BlendCoeff);
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(4 == kDC_BlendCoeff);
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(5 == kIDC_BlendCoeff);
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(6 == kSA_BlendCoeff);
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(7 == kISA_BlendCoeff);
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(8 == kDA_BlendCoeff);
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(9 == kIDA_BlendCoeff);
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(10 == kConstC_BlendCoeff);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(11 == kIConstC_BlendCoeff);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(12 == kConstA_BlendCoeff);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(13 == kIConstA_BlendCoeff);
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(14 == kS2C_BlendCoeff);
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(15 == kIS2C_BlendCoeff);
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(16 == kS2A_BlendCoeff);
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(17 == kIS2A_BlendCoeff);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_STATIC_ASSERT(kTotalBlendCoeffCount == GR_ARRAY_COUNT(gXfermodeCoeff2Blend));
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::AdjustTextureMatrix(const GrGLTexture* texture,
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  GrSamplerState::SampleMode mode,
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  GrMatrix* matrix) {
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != texture);
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != matrix);
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::Orientation orientation = texture->orientation();
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GrGLTexture::kBottomUp_Orientation == orientation) {
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrMatrix invY;
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        invY.setAll(GR_Scalar1, 0,           0,
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    0,          -GR_Scalar1, GR_Scalar1,
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    0,          0,           GrMatrix::I()[8]);
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        matrix->postConcat(invY);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(GrGLTexture::kTopDown_Orientation == orientation);
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::TextureMatrixIsIdentity(const GrGLTexture* texture,
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      const GrSamplerState& sampler) {
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != texture);
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!sampler.getMatrix().isIdentity()) {
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::Orientation orientation = texture->orientation();
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GrGLTexture::kBottomUp_Orientation == orientation) {
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(GrGLTexture::kTopDown_Orientation == orientation);
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic bool gPrintStartupSpew;
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic bool fbo_test(const GrGLInterface* gl, int w, int h) {
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, ActiveTexture(GR_GL_TEXTURE0 + SPARE_TEX_UNIT));
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint testFBO;
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, GenFramebuffers(1, &testFBO));
1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, BindFramebuffer(GR_GL_FRAMEBUFFER, testFBO));
1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint testRTTex;
1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, GenTextures(1, &testRTTex));
1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, testRTTex));
1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // some implementations require texture to be mip-map complete before
1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // FBO with level 0 bound as color attachment will be framebuffer complete.
1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D,
1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_MIN_FILTER,
1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_NEAREST));
1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexImage2D(GR_GL_TEXTURE_2D, 0, GR_GL_RGBA, w, h,
1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              0, GR_GL_RGBA, GR_GL_UNSIGNED_BYTE, NULL));
1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, BindTexture(GR_GL_TEXTURE_2D, 0));
1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, FramebufferTexture2D(GR_GL_FRAMEBUFFER,
1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_COLOR_ATTACHMENT0,
1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_TEXTURE_2D, testRTTex, 0));
1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum status;
1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL_RET(gl, status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, DeleteFramebuffers(1, &testFBO));
1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, DeleteTextures(1, &testRTTex));
1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return status == GR_GL_FRAMEBUFFER_COMPLETE;
1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1804f1dae40e24d57d647db01443b8bf2410514b8b5Derek SollenbergerGrGpuGL::GrGpuGL(const GrGLContextInfo& ctxInfo) : fGLContextInfo(ctxInfo) {
1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrAssert(ctxInfo.isInitialized());
1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    fPrintedCaps = false;
1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrGLClearErr(fGLContextInfo.interface());
1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (gPrintStartupSpew) {
1894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const GrGLubyte* ext;
1904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GL_CALL_RET(ext, GetString(GR_GL_EXTENSIONS));
1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrGLubyte* vendor;
1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrGLubyte* renderer;
1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrGLubyte* version;
1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL_RET(vendor, GetString(GR_GL_VENDOR));
1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL_RET(renderer, GetString(GR_GL_RENDERER));
1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL_RET(version, GetString(GR_GL_VERSION));
1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("------------------------- create GrGpuGL %p --------------\n",
1981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 this);
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("------ VENDOR %s\n", vendor);
2001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("------ RENDERER %s\n", renderer);
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("------ VERSION %s\n",  version);
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrPrintf("------ EXTENSIONS\n %s \n", ext);
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->resetDirtyFlags();
2061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->initCaps();
2081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fLastSuccessfulStencilFmtIdx = 0;
2104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    fCanPreserveUnpremulRoundtrip = kUnknown_CanPreserveUnpremulRoundtrip;
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2131cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGpuGL::~GrGpuGL() {
2141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // This must be called by before the GrDrawTarget destructor
2151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->releaseGeometry();
2161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // This subclass must do this before the base class destructor runs
2171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // since we will unref the GrGLInterface.
2181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->releaseResources();
2191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
2221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::initCaps() {
2241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint maxTextureUnits;
2251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // check FS and fixed-function texture unit limits
2261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we only use textures in the fragment stage currently.
2271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // checks are > to make sure we have a spare unit.
2284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    const GrGLInterface* gl = this->glInterface();
2294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
2301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(maxTextureUnits > GrDrawState::kNumStages);
2311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kES2_GrGLBinding != this->glBinding()) {
2324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_UNITS, &maxTextureUnits);
2331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(maxTextureUnits > GrDrawState::kNumStages);
2341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint numFormats;
2374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GR_GL_GetIntegerv(gl, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats);
2381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoSTMalloc<10, GrGLint> formats(numFormats);
2394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GR_GL_GetIntegerv(gl, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats);
2401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < numFormats; ++i) {
2411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (formats[i] == GR_GL_PALETTE8_RGBA8) {
2421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fCaps.f8BitPaletteSupport = true;
2431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
2441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kDesktop_GrGLBinding == this->glBinding()) {
2481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we could also look for GL_ATI_separate_stencil extension or
2491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // GL_EXT_stencil_two_side but they use different function signatures
2501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // than GL2.0+ (and than each other).
2514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fCaps.fTwoSidedStencilSupport = (this->glVersion() >= GR_GL_VER(2,0));
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // supported on GL 1.4 and higher or by extension
2534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fCaps.fStencilWrapOpsSupport = (this->glVersion() >= GR_GL_VER(1,4)) ||
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       this->hasExtension("GL_EXT_stencil_wrap");
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
2561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // ES 2 has two sided stencil and stencil wrap
2571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fCaps.fTwoSidedStencilSupport = true;
2581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fCaps.fStencilWrapOpsSupport = true;
2591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kDesktop_GrGLBinding == this->glBinding()) {
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fCaps.fBufferLockSupport = true; // we require VBO support and the desktop VBO
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         // extension includes glMapBuffer.
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fCaps.fBufferLockSupport = this->hasExtension("GL_OES_mapbuffer");
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kDesktop_GrGLBinding == this->glBinding()) {
2694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (this->glVersion() >= GR_GL_VER(2,0) ||
2701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            this->hasExtension("GL_ARB_texture_non_power_of_two")) {
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fCaps.fNPOTTextureTileSupport = true;
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fCaps.fNPOTTextureTileSupport = false;
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fCaps.fNPOTTextureTileSupport = this->hasExtension("GL_OES_texture_npot");
2781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
2791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fCaps.fHWAALineSupport = (kDesktop_GrGLBinding == this->glBinding());
2811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ////////////////////////////////////////////////////////////////////////////
2831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Experiments to determine limitations that can't be queried.
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // TODO: Make these a preprocess that generate some compile time constants.
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // TODO: probe once at startup, rather than once per context creation.
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_SIZE, &fCaps.fMaxTextureSize);
2884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GR_GL_GetIntegerv(gl, GR_GL_MAX_RENDERBUFFER_SIZE, &fCaps.fMaxRenderTargetSize);
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Our render targets are always created with textures as the color
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // attachment, hence this min:
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fCaps.fMaxRenderTargetSize = GrMin(fCaps.fMaxTextureSize, fCaps.fMaxRenderTargetSize);
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    fCaps.fFSAASupport = GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType();
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerbool GrGpuGL::canPreserveReadWriteUnpremulPixels() {
2974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kUnknown_CanPreserveUnpremulRoundtrip ==
2984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fCanPreserveUnpremulRoundtrip) {
2994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkAutoTMalloc<uint32_t> data(256 * 256 * 3);
3014f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        uint32_t* srcData = data.get();
3024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        uint32_t* firstRead = data.get() + 256 * 256;
3034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        uint32_t* secondRead = data.get() + 2 * 256 * 256;
3044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3054f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        for (int y = 0; y < 256; ++y) {
3064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            for (int x = 0; x < 256; ++x) {
3074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                uint8_t* color = reinterpret_cast<uint8_t*>(&srcData[256*y + x]);
3084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                color[3] = y;
3094f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                color[2] = x;
3104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                color[1] = x;
3114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                color[0] = x;
3124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            }
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // We have broader support for read/write pixels on render targets
3164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // than on textures.
3174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrTextureDesc dstDesc;
3184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        dstDesc.fFlags = kRenderTarget_GrTextureFlagBit |
3194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                         kNoStencil_GrTextureFlagBit;
3204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        dstDesc.fWidth = 256;
3214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        dstDesc.fHeight = 256;
3224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        dstDesc.fConfig = kRGBA_8888_GrPixelConfig;
3234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        dstDesc.fSampleCnt = 0;
3244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        SkAutoTUnref<GrTexture> dstTex(this->createTexture(dstDesc, NULL, 0));
3264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!dstTex.get()) {
3274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            return false;
3284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        }
3294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrRenderTarget* rt = dstTex.get()->asRenderTarget();
3304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrAssert(NULL != rt);
3314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        bool failed = true;
3334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        static const UnpremulConversion gMethods[] = {
3344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            kUpOnWrite_DownOnRead_UnpremulConversion,
3354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            kDownOnWrite_UpOnRead_UnpremulConversion,
3364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        };
3374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // pretend that we can do the roundtrip to avoid recursive calls to
3394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        // this function
3404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fCanPreserveUnpremulRoundtrip = kYes_CanPreserveUnpremulRoundtrip;
3414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        for (size_t i = 0; i < GR_ARRAY_COUNT(gMethods) && failed; ++i) {
3424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            fUnpremulConversion = gMethods[i];
3434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            rt->writePixels(0, 0,
3444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            256, 256,
3454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            kRGBA_8888_UPM_GrPixelConfig, srcData, 0);
3464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            rt->readPixels(0, 0,
3474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                           256, 256,
3484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                           kRGBA_8888_UPM_GrPixelConfig, firstRead, 0);
3494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            rt->writePixels(0, 0,
3504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            256, 256,
3514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                            kRGBA_8888_UPM_GrPixelConfig, firstRead, 0);
3524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            rt->readPixels(0, 0,
3534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                           256, 256,
3544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                           kRGBA_8888_UPM_GrPixelConfig, secondRead, 0);
3554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            failed = false;
3564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            for (int j = 0; j < 256 * 256; ++j) {
3574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (firstRead[j] != secondRead[j]) {
3584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    failed = true;
3594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    break;
3604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                }
3614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            }
3621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
3634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fCanPreserveUnpremulRoundtrip = failed ?
3644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                        kNo_CanPreserveUnpremulRoundtrip :
3654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                        kYes_CanPreserveUnpremulRoundtrip;
3661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (kYes_CanPreserveUnpremulRoundtrip == fCanPreserveUnpremulRoundtrip) {
3694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return true;
3701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
3714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return false;
3721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3751cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrPixelConfig GrGpuGL::preferredReadPixelsConfig(GrPixelConfig config) const {
3761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && GrPixelConfigIsRGBA8888(config)) {
3771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrPixelConfigSwapRAndB(config);
3781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
3791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return config;
3801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3831cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrPixelConfig GrGpuGL::preferredWritePixelsConfig(GrPixelConfig config) const {
3841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && GrPixelConfigIsRGBA8888(config)) {
3851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return GrPixelConfigSwapRAndB(config);
3861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
3871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return config;
3881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::fullReadPixelsIsFasterThanPartial() const {
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL);
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onResetContext() {
3961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (gPrintStartupSpew && !fPrintedCaps) {
3971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPrintedCaps = true;
3981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->getCaps().print();
3994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        this->glCaps().print();
4001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // We detect cases when blending is effectively off
4031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWBlendDisabled = false;
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Enable(GR_GL_BLEND));
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we don't use the zb at all
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Disable(GR_GL_DEPTH_TEST));
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(DepthMask(GR_GL_FALSE));
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Disable(GR_GL_CULL_FACE));
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(FrontFace(GR_GL_CCW));
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setDrawFace(GrDrawState::kBoth_DrawFace);
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Disable(GR_GL_DITHER));
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kDesktop_GrGLBinding == this->glBinding()) {
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(Disable(GR_GL_LINE_SMOOTH));
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(Disable(GR_GL_POINT_SMOOTH));
4181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(Disable(GR_GL_MULTISAMPLE));
4191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWAAState.fMSAAEnabled = false;
4201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWAAState.fSmoothLineEnabled = false;
4211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE));
4241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.resetStateFlags();
4251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we only ever use lines in hairline mode
4271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(LineWidth(1));
4281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // invalid
4301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fActiveTextureUnitIdx = -1;
4311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // illegal values
4331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setBlendFunc((GrBlendCoeff)0xFF, (GrBlendCoeff)0xFF);
4341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setBlendConstant(0x00000000);
4361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(BlendColor(0,0,0,0));
4371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setColor(GrColor_ILLEGAL);
4391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setViewMatrix(GrMatrix::InvalidMatrix());
4411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
4431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setTexture(s, NULL);
4441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.sampler(s)->setRadial2Params(-GR_ScalarMax,
4451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  -GR_ScalarMax,
4461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                  true);
4471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *fHWDrawState.sampler(s)->matrix() = GrMatrix::InvalidMatrix();
4484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fHWDrawState.sampler(s)->setConvolutionParams(0, NULL);
4491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWBounds.fScissorRect.invalidate();
4521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWBounds.fScissorEnabled = false;
4531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Disable(GR_GL_SCISSOR_TEST));
4541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWBounds.fViewportRect.invalidate();
4551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.stencil()->invalidate();
4571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWStencilClip = false;
4581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fClipInStencil = false;
4591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWGeometryState.fIndexBuffer = NULL;
4611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWGeometryState.fVertexBuffer = NULL;
4621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWGeometryState.fArrayPtrsDirty = true;
4641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE));
4661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setRenderTarget(NULL);
4671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we assume these values
4694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().unpackRowLengthSupport()) {
4701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
4711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().packRowLengthSupport()) {
4731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0));
4741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().unpackFlipYSupport()) {
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE));
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().packFlipYSupport()) {
4791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, GR_GL_FALSE));
4801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
4821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4831cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrTexture* GrGpuGL::onCreatePlatformTexture(const GrPlatformTextureDesc& desc) {
4841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::Desc glTexDesc;
4851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!configToGLFormats(desc.fConfig, false, NULL, NULL, NULL)) {
4861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return NULL;
4871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fWidth = desc.fWidth;
4901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fHeight = desc.fHeight;
4911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fConfig = desc.fConfig;
4921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
4931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fOwnsID = false;
4941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fOrientation = GrGLTexture::kBottomUp_Orientation;
4951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture* texture = NULL;
4971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc.fFlags & kRenderTarget_GrPlatformTextureFlag) {
4981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLRenderTarget::Desc glRTDesc;
4991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fRTFBOID = 0;
5001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fTexFBOID = 0;
5011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fMSColorRenderbufferID = 0;
5021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fOwnIDs = true;
5031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fConfig = desc.fConfig;
5041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        glRTDesc.fSampleCnt = desc.fSampleCnt;
5051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!this->createRenderTargetObjects(glTexDesc.fWidth,
5061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             glTexDesc.fHeight,
5071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             glTexDesc.fTextureID,
5081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             &glRTDesc)) {
5091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return NULL;
5101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
5111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        texture = new GrGLTexture(this, glTexDesc, glRTDesc);
5121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
5131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        texture = new GrGLTexture(this, glTexDesc);
5141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == texture) {
5161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return NULL;
5171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->setSpareTextureUnit();
5201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return texture;
5211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5231cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrRenderTarget* GrGpuGL::onCreatePlatformRenderTarget(const GrPlatformRenderTargetDesc& desc) {
5241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget::Desc glDesc;
5251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fConfig = desc.fConfig;
5261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fRTFBOID = static_cast<GrGLuint>(desc.fRenderTargetHandle);
5271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fMSColorRenderbufferID = 0;
5281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
5291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fSampleCnt = desc.fSampleCnt;
5301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glDesc.fOwnIDs = false;
5311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLIRect viewport;
5321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    viewport.fLeft   = 0;
5331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    viewport.fBottom = 0;
5341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    viewport.fWidth  = desc.fWidth;
5351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    viewport.fHeight = desc.fHeight;
5361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrRenderTarget* tgt = new GrGLRenderTarget(this, glDesc, viewport);
5381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc.fStencilBits) {
5391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLStencilBuffer::Format format;
5401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        format.fInternalFormat = GrGLStencilBuffer::kUnknownInternalFormat;
5411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        format.fPacked = false;
5421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        format.fStencilBits = desc.fStencilBits;
5431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        format.fTotalBits = desc.fStencilBits;
5441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLStencilBuffer* sb = new GrGLStencilBuffer(this,
5451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                      0,
5461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                      desc.fWidth,
5471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                      desc.fHeight,
5481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                      desc.fSampleCnt,
5491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                      format);
5501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tgt->setStencilBuffer(sb);
5511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        sb->unref();
5521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return tgt;
5541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
5571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onWriteTexturePixels(GrTexture* texture,
5591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   int left, int top, int width, int height,
5601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   GrPixelConfig config, const void* buffer,
5611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                   size_t rowBytes) {
5621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == buffer) {
5631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return;
5641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture* glTex = static_cast<GrGLTexture*>(texture);
5661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->setSpareTextureUnit();
5681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTex->textureID()));
5691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::Desc desc;
5701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fConfig = glTex->config();
5711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fWidth = glTex->width();
5721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fHeight = glTex->height();
5731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fOrientation = glTex->orientation();
5741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc.fTextureID = glTex->textureID();
5751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->uploadTexData(desc, false,
5771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        left, top, width, height,
5781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        config, buffer, rowBytes);
5791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
5801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace {
5821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool adjust_pixel_ops_params(int surfaceWidth,
5831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             int surfaceHeight,
5841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             size_t bpp,
5851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             int* left, int* top, int* width, int* height,
5861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             const void** data,
5871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             size_t* rowBytes) {
5881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!*rowBytes) {
5891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *rowBytes = *width * bpp;
5901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrIRect subRect = GrIRect::MakeXYWH(*left, *top, *width, *height);
5931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrIRect bounds = GrIRect::MakeWH(surfaceWidth, surfaceHeight);
5941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
5951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!subRect.intersect(bounds)) {
5961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
5971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
5981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *data = reinterpret_cast<const void*>(reinterpret_cast<intptr_t>(*data) +
5991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger          (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp);
6001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *left = subRect.fLeft;
6021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *top = subRect.fTop;
6031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *width = subRect.width();
6041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    *height = subRect.height();
6051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
6061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
6081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc,
6101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            bool isNewTexture,
6111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            int left, int top, int width, int height,
6121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            GrPixelConfig dataConfig,
6131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            const void* data,
6141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            size_t rowBytes) {
6151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != data || isNewTexture);
6161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t bpp = GrBytesPerPixel(dataConfig);
6181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!adjust_pixel_ops_params(desc.fWidth, desc.fHeight, bpp, &left, &top,
6191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 &width, &height, &data, &rowBytes)) {
6201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
6211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t trimRowBytes = width * bpp;
6231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // in case we need a temporary, trimmed copy of the src pixels
6251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoSMalloc<128 * 128> tempStorage;
6261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool useTexStorage = isNewTexture &&
6284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                         this->glCaps().texStorageSupport();
6291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (useTexStorage) {
6301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (kDesktop_GrGLBinding == this->glBinding()) {
6311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // 565 is not a sized internal format on desktop GL. So on desktop
6321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // with 565 we always use an unsized internal format to let the
6331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // system pick the best sized format to convert the 565 data to.
6341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Since glTexStorage only allows sized internal formats we will
6351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // instead fallback to glTexImage2D.
6361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            useTexStorage = desc.fConfig != kRGB_565_GrPixelConfig;
6371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
6381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // ES doesn't allow paletted textures to be used with tex storage
6391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            useTexStorage = desc.fConfig != kIndex_8_GrPixelConfig;
6401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum internalFormat;
6441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum externalFormat;
6451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum externalType;
6461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // glTexStorage requires sized internal formats on both desktop and ES. ES
6471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // glTexImage requires an unsized format.
6481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!this->configToGLFormats(dataConfig, useTexStorage, &internalFormat,
6491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 &externalFormat, &externalType)) {
6501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
6511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!isNewTexture && GR_GL_PALETTE8_RGBA8 == internalFormat) {
6541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // paletted textures cannot be updated
6551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
6561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
6571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /*
6591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  check whether to allocate a temporary buffer for flipping y or
6601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  because our srcData has extra bytes past each row. If so, we need
6611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  to trim those off here, since GL ES may not let us specify
6621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  GL_UNPACK_ROW_LENGTH.
6631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool restoreGLRowLength = false;
6651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool swFlipY = false;
6661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool glFlipY = false;
6671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL != data) {
6681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (GrGLTexture::kBottomUp_Orientation == desc.fOrientation) {
6694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (this->glCaps().unpackFlipYSupport()) {
6701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                glFlipY = true;
6711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
6721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                swFlipY = true;
6731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
6741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
6754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (this->glCaps().unpackRowLengthSupport() && !swFlipY) {
6761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // can't use this for flipping, only non-neg values allowed. :(
6771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (rowBytes != trimRowBytes) {
6781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrGLint rowLength = static_cast<GrGLint>(rowBytes / bpp);
6791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, rowLength));
6801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                restoreGLRowLength = true;
6811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
6821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
6831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (trimRowBytes != rowBytes || swFlipY) {
6841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // copy data into our new storage, skipping the trailing bytes
6851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                size_t trimSize = height * trimRowBytes;
6861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                const char* src = (const char*)data;
6871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (swFlipY) {
6881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    src += (height - 1) * rowBytes;
6891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
6901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                char* dst = (char*)tempStorage.reset(trimSize);
6911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                for (int y = 0; y < height; y++) {
6921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    memcpy(dst, src, trimRowBytes);
6931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    if (swFlipY) {
6941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        src -= rowBytes;
6951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    } else {
6961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        src += rowBytes;
6971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    }
6981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    dst += trimRowBytes;
6991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
7001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // now point data to our copied version
7011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                data = tempStorage.get();
7021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
7031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (glFlipY) {
7051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE));
7061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, static_cast<GrGLint>(bpp)));
7081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool succeeded = true;
7101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (isNewTexture &&
7111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        0 == left && 0 == top &&
7121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        desc.fWidth == width && desc.fHeight == height) {
7134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
7141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (useTexStorage) {
7151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // We never resize  or change formats of textures. We don't use
7161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // mipmaps currently.
7174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GL_ALLOC_CALL(this->glInterface(),
7184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          TexStorage2D(GR_GL_TEXTURE_2D,
7194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       1, // levels
7204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       internalFormat,
7214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                       desc.fWidth, desc.fHeight));
7221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
7231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (GR_GL_PALETTE8_RGBA8 == internalFormat) {
7241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrGLsizei imageSize = desc.fWidth * desc.fHeight +
7251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      kGrColorTableSize;
7264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                GL_ALLOC_CALL(this->glInterface(),
7274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                              CompressedTexImage2D(GR_GL_TEXTURE_2D,
7284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   0, // level
7294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   internalFormat,
7304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   desc.fWidth, desc.fHeight,
7314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   0, // border
7324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   imageSize,
7334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                   data));
7341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
7354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                GL_ALLOC_CALL(this->glInterface(),
7364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                              TexImage2D(GR_GL_TEXTURE_2D,
7374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         0, // level
7384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         internalFormat,
7394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         desc.fWidth, desc.fHeight,
7404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         0, // border
7414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         externalFormat, externalType,
7424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                         data));
7431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
7441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrGLenum error = CHECK_ALLOC_ERROR(this->glInterface());
7461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (error != GR_GL_NO_ERROR) {
7471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            succeeded = false;
7481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
7491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // if we have data and we used TexStorage to create the texture, we
7501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // now upload with TexSubImage.
7511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (NULL != data && useTexStorage) {
7521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D,
7531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      0, // level
7541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      left, top,
7551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      width, height,
7561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      externalFormat, externalType,
7571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      data));
7581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
7591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
7611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (swFlipY || glFlipY) {
7621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            top = desc.fHeight - (top + height);
7631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
7641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D,
7651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              0, // level
7661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              left, top,
7671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              width, height,
7681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              externalFormat, externalType, data));
7691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (restoreGLRowLength) {
7724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrAssert(this->glCaps().unpackRowLengthSupport());
7731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
7741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (glFlipY) {
7761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE));
7771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return succeeded;
7791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
7801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::createRenderTargetObjects(int width, int height,
7821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GrGLuint texID,
7831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GrGLRenderTarget::Desc* desc) {
7841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc->fMSColorRenderbufferID = 0;
7851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc->fRTFBOID = 0;
7861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc->fTexFBOID = 0;
7871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    desc->fOwnIDs = true;
7881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum status;
7901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint err;
7911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum msColorFormat = 0; // suppress warning
7931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(GenFramebuffers(1, &desc->fTexFBOID));
7951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!desc->fTexFBOID) {
7961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        goto FAILED;
7971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
7981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
7991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // If we are using multisampling we will create two FBOS. We render
8011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // to one and then resolve to the texture bound to the other.
8021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc->fSampleCnt > 0) {
8034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType()) {
8041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            goto FAILED;
8051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
8061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(GenFramebuffers(1, &desc->fRTFBOID));
8071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(GenRenderbuffers(1, &desc->fMSColorRenderbufferID));
8081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!desc->fRTFBOID ||
8091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            !desc->fMSColorRenderbufferID ||
8101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            !this->configToGLFormats(desc->fConfig,
8111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     // GLES requires sized internal formats
8121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     kES2_GrGLBinding == this->glBinding(),
8131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                     &msColorFormat, NULL, NULL)) {
8141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            goto FAILED;
8151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
8161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
8171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        desc->fRTFBOID = desc->fTexFBOID;
8181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // below here we may bind the FBO
8211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.setRenderTarget(NULL);
8221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc->fRTFBOID != desc->fTexFBOID) {
8231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(desc->fSampleCnt > 1);
8241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER,
8251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               desc->fMSColorRenderbufferID));
8264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
8274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GL_ALLOC_CALL(this->glInterface(),
8284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                      RenderbufferStorageMultisample(GR_GL_RENDERBUFFER,
8294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                     desc->fSampleCnt,
8304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                     msColorFormat,
8314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                     width, height));
8324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        err = CHECK_ALLOC_ERROR(this->glInterface());
8331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (err != GR_GL_NO_ERROR) {
8341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            goto FAILED;
8351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
8361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID));
8371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
8381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      GR_GL_COLOR_ATTACHMENT0,
8391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      GR_GL_RENDERBUFFER,
8401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      desc->fMSColorRenderbufferID));
8414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
8424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
8434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
8444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                goto FAILED;
8454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            }
8464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            fGLContextInfo.caps().markConfigAsValidColorAttachment(
8474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                                desc->fConfig);
8481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
8491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID));
8511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER,
8531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_COLOR_ATTACHMENT0,
8541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_2D,
8551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 texID, 0));
8564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
8574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
8584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
8594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            goto FAILED;
8604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        }
8614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        fGLContextInfo.caps().markConfigAsValidColorAttachment(desc->fConfig);
8621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
8651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8661cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerFAILED:
8671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc->fMSColorRenderbufferID) {
8681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(DeleteRenderbuffers(1, &desc->fMSColorRenderbufferID));
8691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc->fRTFBOID != desc->fTexFBOID) {
8711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(DeleteFramebuffers(1, &desc->fRTFBOID));
8721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (desc->fTexFBOID) {
8741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(DeleteFramebuffers(1, &desc->fTexFBOID));
8751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
8761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return false;
8771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// good to set a break-point here to know when createTexture fails
8801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GrTexture* return_null_texture() {
8811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//    GrAssert(!"null texture");
8821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return NULL;
8831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if GR_DEBUG
8861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic size_t as_size_t(int x) {
8871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return x;
8881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
8891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
8901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8911cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrTexture* GrGpuGL::onCreateTexture(const GrTextureDesc& desc,
8921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    const void* srcData,
8931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    size_t rowBytes) {
8941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if GR_COLLECT_STATS
8961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ++fStats.fTextureCreateCnt;
8971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
8981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
8991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::Desc glTexDesc;
9001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget::Desc  glRTDesc;
9011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    // Attempt to catch un- or wrongly initialized sample counts;
9034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrAssert(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64);
9044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
9051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fWidth  = desc.fWidth;
9061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fHeight = desc.fHeight;
9074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    glTexDesc.fConfig = desc.fConfig;
9084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    glTexDesc.fOwnsID = true;
9091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glRTDesc.fMSColorRenderbufferID = 0;
9111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glRTDesc.fRTFBOID = 0;
9121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glRTDesc.fTexFBOID = 0;
9131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glRTDesc.fOwnIDs = true;
9141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glRTDesc.fConfig = glTexDesc.fConfig;
9151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit);
9171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const Caps& caps = this->getCaps();
9191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // We keep GrRenderTargets in GL's normal orientation so that they
9211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // can be drawn to by the outside world without the client having
9221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // to render upside down.
9231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glTexDesc.fOrientation = renderTarget ? GrGLTexture::kBottomUp_Orientation :
9241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                            GrGLTexture::kTopDown_Orientation;
9251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    glRTDesc.fSampleCnt = desc.fSampleCnt;
9274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() &&
9284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        desc.fSampleCnt) {
9294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrPrintf("MSAA RT requested but not supported on this platform.");
9301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (renderTarget) {
9331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (glTexDesc.fWidth > caps.fMaxRenderTargetSize ||
9341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            glTexDesc.fHeight > caps.fMaxRenderTargetSize) {
9351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return return_null_texture();
9361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
9371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(GenTextures(1, &glTexDesc.fTextureID));
9404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (renderTarget && this->glCaps().textureUsageSupport()) {
9411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // provides a hint about how this texture will be used
9421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
9431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              GR_GL_TEXTURE_USAGE,
9441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              GR_GL_FRAMEBUFFER_ATTACHMENT));
9451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!glTexDesc.fTextureID) {
9471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return return_null_texture();
9481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->setSpareTextureUnit();
9511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTexDesc.fTextureID));
9521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Some drivers like to know filter/wrap before seeing glTexImage2D. Some
9541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // drivers have a bug where an FBO won't be complete if it includes a
9551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // texture that is not mipmap complete (considering the filter in use).
9561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture::TexParams initialTexParams;
9571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we only set a subset here so invalidate first
9581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    initialTexParams.invalidate();
9591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    initialTexParams.fFilter = GR_GL_NEAREST;
9601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    initialTexParams.fWrapS = GR_GL_CLAMP_TO_EDGE;
9611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    initialTexParams.fWrapT = GR_GL_CLAMP_TO_EDGE;
9621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
9631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          GR_GL_TEXTURE_MAG_FILTER,
9641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          initialTexParams.fFilter));
9651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
9661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          GR_GL_TEXTURE_MIN_FILTER,
9671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          initialTexParams.fFilter));
9681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
9691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          GR_GL_TEXTURE_WRAP_S,
9701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          initialTexParams.fWrapS));
9711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
9721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          GR_GL_TEXTURE_WRAP_T,
9731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          initialTexParams.fWrapT));
9741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!this->uploadTexData(glTexDesc, true, 0, 0,
9751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             glTexDesc.fWidth, glTexDesc.fHeight,
9761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             desc.fConfig, srcData, rowBytes)) {
9771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
9781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return return_null_texture();
9791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
9811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLTexture* tex;
9821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (renderTarget) {
9831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if GR_COLLECT_STATS
9841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ++fStats.fRenderTargetCreateCnt;
9851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
9861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!this->createRenderTargetObjects(glTexDesc.fWidth,
9871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             glTexDesc.fHeight,
9881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             glTexDesc.fTextureID,
9891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             &glRTDesc)) {
9901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
9911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return return_null_texture();
9921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
9931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tex = new GrGLTexture(this, glTexDesc, glRTDesc);
9941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
9951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        tex = new GrGLTexture(this, glTexDesc);
9961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
9971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    tex->setCachedTexParams(initialTexParams, this->getResetTimestamp());
9981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef TRACE_TEXTURE_CREATION
9991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n",
10001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger             glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig);
10011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
10021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return tex;
10031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace {
10064f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
10074f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerconst GrGLuint kUnknownBitCount = GrGLStencilBuffer::kUnknownBitCount;
10084f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
10091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid inline get_stencil_rb_sizes(const GrGLInterface* gl,
10101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GrGLuint rb,
10111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GrGLStencilBuffer::Format* format) {
10121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we shouldn't ever know one size and not the other
10131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((kUnknownBitCount == format->fStencilBits) ==
10141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger             (kUnknownBitCount == format->fTotalBits));
10151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kUnknownBitCount == format->fStencilBits) {
10161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GR_GL_GetRenderbufferParameteriv(gl, GR_GL_RENDERBUFFER,
10171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         GR_GL_RENDERBUFFER_STENCIL_SIZE,
10181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                         (GrGLint*)&format->fStencilBits);
10191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (format->fPacked) {
10201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GR_GL_GetRenderbufferParameteriv(gl, GR_GL_RENDERBUFFER,
10211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             GR_GL_RENDERBUFFER_DEPTH_SIZE,
10221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                             (GrGLint*)&format->fTotalBits);
10231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            format->fTotalBits += format->fStencilBits;
10241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
10251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            format->fTotalBits = format->fStencilBits;
10261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
10271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
10281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt,
10321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 int width, int height) {
10331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // All internally created RTs are also textures. We don't create
10351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // SBs for a client's standalone RT (that is RT that isnt also a texture).
10361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(rt->asTexture());
10371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(width >= rt->width());
10381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(height >= rt->height());
10391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int samples = rt->numSamples();
10411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint sbID;
10421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(GenRenderbuffers(1, &sbID));
10431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!sbID) {
10441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
10451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
10461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLStencilBuffer* sb = NULL;
10481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    int stencilFmtCnt = this->glCaps().stencilFormats().count();
10501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < stencilFmtCnt; ++i) {
10511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbID));
10521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we start with the last stencil format that succeeded in hopes
10531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // that we won't go through this loop more than once after the
10541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // first (painful) stencil creation.
10551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int sIdx = (i + fLastSuccessfulStencilFmtIdx) % stencilFmtCnt;
10564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        const GrGLCaps::StencilFormat& sFmt =
10574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                this->glCaps().stencilFormats()[sIdx];
10584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
10591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we do this "if" so that we don't call the multisample
10601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // version on a GL that doesn't have an MSAA extension.
10611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (samples > 1) {
10624f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GL_ALLOC_CALL(this->glInterface(),
10634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          RenderbufferStorageMultisample(GR_GL_RENDERBUFFER,
10644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                         samples,
10654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                         sFmt.fInternalFormat,
10664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                         width, height));
10671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
10684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GL_ALLOC_CALL(this->glInterface(),
10694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                          RenderbufferStorage(GR_GL_RENDERBUFFER,
10704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                              sFmt.fInternalFormat,
10714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                              width, height));
10721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
10731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrGLenum err = CHECK_ALLOC_ERROR(this->glInterface());
10751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (err == GR_GL_NO_ERROR) {
10761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // After sized formats we attempt an unsized format and take whatever
10771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // sizes GL gives us. In that case we query for the size.
10781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLStencilBuffer::Format format = sFmt;
10791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            get_stencil_rb_sizes(this->glInterface(), sbID, &format);
10801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            sb = new GrGLStencilBuffer(this, sbID, width, height,
10811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       samples, format);
10821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (this->attachStencilBufferToRenderTarget(sb, rt)) {
10831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fLastSuccessfulStencilFmtIdx = sIdx;
10841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                rt->setStencilBuffer(sb);
10851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                sb->unref();
10861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                return true;
10871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger           }
10881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger           sb->abandon(); // otherwise we lose sbID
10891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger           sb->unref();
10901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
10911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
10921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(DeleteRenderbuffers(1, &sbID));
10931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return false;
10941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
10951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
10961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::attachStencilBufferToRenderTarget(GrStencilBuffer* sb,
10971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                GrRenderTarget* rt) {
10981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget* glrt = (GrGLRenderTarget*) rt;
10991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint fbo = glrt->renderFBOID();
11011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == sb) {
11031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (NULL != rt->getStencilBuffer()) {
11041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_STENCIL_ATTACHMENT,
11061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_RENDERBUFFER, 0));
11071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_DEPTH_ATTACHMENT,
11091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_RENDERBUFFER, 0));
11101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if GR_DEBUG
11111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLenum status;
11121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
11131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(GR_GL_FRAMEBUFFER_COMPLETE == status);
11141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
11151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
11161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return true;
11171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
11181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLStencilBuffer* glsb = (GrGLStencilBuffer*) sb;
11191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLuint rb = glsb->renderbufferID();
11201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setRenderTarget(NULL);
11221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, fbo));
11231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      GR_GL_STENCIL_ATTACHMENT,
11251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                      GR_GL_RENDERBUFFER, rb));
11261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (glsb->format().fPacked) {
11271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_DEPTH_ATTACHMENT,
11291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_RENDERBUFFER, rb));
11301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
11311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_DEPTH_ATTACHMENT,
11331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          GR_GL_RENDERBUFFER, 0));
11341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
11351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLenum status;
11374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (!this->glCaps().isColorConfigAndStencilFormatVerified(rt->config(),
11384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                           glsb->format())) {
11394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
11404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
11411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                              GR_GL_STENCIL_ATTACHMENT,
11431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              GR_GL_RENDERBUFFER, 0));
11444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                if (glsb->format().fPacked) {
11454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
11464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                  GR_GL_DEPTH_ATTACHMENT,
11474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                                  GR_GL_RENDERBUFFER, 0));
11484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                }
11494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                return false;
11504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            } else {
11514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                fGLContextInfo.caps().markColorConfigAndStencilFormatAsVerified(
11524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    rt->config(),
11534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                    glsb->format());
11541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
11551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
11564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        return true;
11571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
11581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
11591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
11611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11621cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrVertexBuffer* GrGpuGL::onCreateVertexBuffer(uint32_t size, bool dynamic) {
11631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint id;
11641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(GenBuffers(1, &id));
11651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (id) {
11661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindBuffer(GR_GL_ARRAY_BUFFER, id));
11671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fArrayPtrsDirty = true;
11684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
11691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // make sure driver can allocate memory for this buffer
11704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GL_ALLOC_CALL(this->glInterface(),
11714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                      BufferData(GR_GL_ARRAY_BUFFER,
11724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 size,
11734f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 NULL,   // data ptr
11744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 dynamic ? GR_GL_DYNAMIC_DRAW :
11754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                           GR_GL_STATIC_DRAW));
11764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
11771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(DeleteBuffers(1, &id));
11781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // deleting bound buffer does implicit bind to 0
11791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWGeometryState.fVertexBuffer = NULL;
11801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return NULL;
11811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
11821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLVertexBuffer* vertexBuffer = new GrGLVertexBuffer(this, id,
11831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                              size, dynamic);
11841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fVertexBuffer = vertexBuffer;
11851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return vertexBuffer;
11861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
11871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return NULL;
11881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
11891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
11901cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrIndexBuffer* GrGpuGL::onCreateIndexBuffer(uint32_t size, bool dynamic) {
11911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLuint id;
11921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(GenBuffers(1, &id));
11931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (id) {
11941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, id));
11954f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
11961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // make sure driver can allocate memory for this buffer
11974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GL_ALLOC_CALL(this->glInterface(),
11984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                      BufferData(GR_GL_ELEMENT_ARRAY_BUFFER,
11994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 size,
12004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 NULL,  // data ptr
12014f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                 dynamic ? GR_GL_DYNAMIC_DRAW :
12024f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                                           GR_GL_STATIC_DRAW));
12034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
12041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(DeleteBuffers(1, &id));
12051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // deleting bound buffer does implicit bind to 0
12061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWGeometryState.fIndexBuffer = NULL;
12071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return NULL;
12081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrIndexBuffer* indexBuffer = new GrGLIndexBuffer(this, id,
12101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                         size, dynamic);
12111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fIndexBuffer = indexBuffer;
12121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return indexBuffer;
12131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return NULL;
12151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
12161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::flushScissor(const GrIRect* rect) {
12181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrDrawState& drawState = this->getDrawState();
12191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrGLRenderTarget* rt =
12201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget());
12211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != rt);
12231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrGLIRect& vp = rt->getViewport();
12241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLIRect scissor;
12261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL != rect) {
12271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        scissor.setRelativeTo(vp, rect->fLeft, rect->fTop,
12281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              rect->width(), rect->height());
12291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (scissor.contains(vp)) {
12301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            rect = NULL;
12311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL != rect) {
12351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWBounds.fScissorRect != scissor) {
12361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scissor.pushToGLScissor(this->glInterface());
12371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fScissorRect = scissor;
12381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!fHWBounds.fScissorEnabled) {
12401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Enable(GR_GL_SCISSOR_TEST));
12411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fScissorEnabled = true;
12421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
12441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWBounds.fScissorEnabled) {
12451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Disable(GR_GL_SCISSOR_TEST));
12461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fScissorEnabled = false;
12471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
12501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onClear(const GrIRect* rect, GrColor color) {
12521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrDrawState& drawState = this->getDrawState();
12531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrRenderTarget* rt = drawState.getRenderTarget();
12541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // parent class should never let us get here with no RT
12551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != rt);
12561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrIRect clippedRect;
12581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL != rect) {
12591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // flushScissor expects rect to be clipped to the target.
12601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        clippedRect = *rect;
12611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrIRect rtRect = SkIRect::MakeWH(rt->width(), rt->height());
12621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (clippedRect.intersect(rtRect)) {
12631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            rect = &clippedRect;
12641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
12651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return;
12661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
12671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushRenderTarget(rect);
12691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushScissor(rect);
12701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLfloat r, g, b, a;
12721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrGLfloat scale255 = 1.f / 255.f;
12731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    a = GrColorUnpackA(color) * scale255;
12741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLfloat scaleRGB = scale255;
12751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GrPixelConfigIsUnpremultiplied(rt->config())) {
12761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        scaleRGB *= a;
12771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    r = GrColorUnpackR(color) * scaleRGB;
12791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    g = GrColorUnpackG(color) * scaleRGB;
12801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    b = GrColorUnpackB(color) * scaleRGB;
12811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE));
12831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.disableState(GrDrawState::kNoColorWrites_StateBit);
12841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ClearColor(r, g, b, a));
12851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Clear(GR_GL_COLOR_BUFFER_BIT));
12861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
12871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::clearStencil() {
12891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == this->getDrawState().getRenderTarget()) {
12901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return;
12911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushRenderTarget(&GrIRect::EmptyIRect());
12941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
12951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWBounds.fScissorEnabled) {
12961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(Disable(GR_GL_SCISSOR_TEST));
12971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWBounds.fScissorEnabled = false;
12981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
12991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(StencilMask(0xffffffff));
13001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ClearStencil(0));
13011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT));
13021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.stencil()->invalidate();
13031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::clearStencilClip(const GrIRect& rect, bool insideClip) {
13061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrDrawState& drawState = this->getDrawState();
13071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrRenderTarget* rt = drawState.getRenderTarget();
13081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != rt);
13091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // this should only be called internally when we know we have a
13111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // stencil buffer.
13121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != rt->getStencilBuffer());
13131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint stencilBitCount =  rt->getStencilBuffer()->bits();
13141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if 0
13151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(stencilBitCount > 0);
13161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint clipStencilMask  = (1 << (stencilBitCount - 1));
13171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
13181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // we could just clear the clip bit but when we go through
13191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // ANGLE a partial stencil mask will cause clears to be
13201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // turned into draws. Our contract on GrDrawTarget says that
13211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // changing the clip between stencil passes may or may not
13221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // zero the client's clip bits. So we just clear the whole thing.
13231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrGLint clipStencilMask  = ~0;
13241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
13251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLint value;
13261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (insideClip) {
13271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        value = (1 << (stencilBitCount - 1));
13281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
13291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        value = 0;
13301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushRenderTarget(&GrIRect::EmptyIRect());
13321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushScissor(&rect);
13331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(StencilMask(clipStencilMask));
13341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ClearStencil(value));
13351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT));
13361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.stencil()->invalidate();
13371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onForceRenderTargetFlush() {
13401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushRenderTarget(&GrIRect::EmptyIRect());
13411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::readPixelsWillPayForYFlip(GrRenderTarget* renderTarget,
13441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        int left, int top,
13451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        int width, int height,
13461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GrPixelConfig config,
13471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        size_t rowBytes) const {
13481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // if GL can do the flip then we'll never pay for it.
13494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().packFlipYSupport()) {
13501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
13511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // If we have to do memcpy to handle non-trim rowBytes then we
13541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // get the flip for free. Otherwise it costs.
13554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (this->glCaps().packRowLengthSupport()) {
13561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return true;
13571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // If we have to do memcpys to handle rowBytes then y-flip is free
13591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Note the rowBytes might be tight to the passed in data, but if data
13601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // gets clipped in x to the target the rowBytes will no longer be tight.
13611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (left >= 0 && (left + width) < renderTarget->width()) {
13621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger           return 0 == rowBytes ||
13631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  GrBytesPerPixel(config) * width == rowBytes;
13641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
13651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
13661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
13681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::onReadPixels(GrRenderTarget* target,
13701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           int left, int top,
13711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           int width, int height,
13721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           GrPixelConfig config,
13731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           void* buffer,
13741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           size_t rowBytes,
13751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                           bool invertY) {
13761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum format;
13771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum type;
13781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!this->configToGLFormats(config, false, NULL, &format, &type)) {
13791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
13801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t bpp = GrBytesPerPixel(config);
13821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (!adjust_pixel_ops_params(target->width(), target->height(), bpp,
13831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 &left, &top, &width, &height,
13841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 const_cast<const void**>(&buffer),
13851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 &rowBytes)) {
13861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return false;
13871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
13881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
13891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // resolve the render target if necessary
13901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget* tgt = static_cast<GrGLRenderTarget*>(target);
13911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState::AutoRenderTargetRestore artr;
13921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (tgt->getResolveType()) {
13931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrGLRenderTarget::kCantResolve_ResolveType:
13941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
13951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrGLRenderTarget::kAutoResolves_ResolveType:
13961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            artr.set(this->drawState(), target);
13971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            this->flushRenderTarget(&GrIRect::EmptyIRect());
13981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
13991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrGLRenderTarget::kCanResolve_ResolveType:
14004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            this->onResolveRenderTarget(tgt);
14011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // we don't track the state of the READ FBO ID.
14021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
14031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    tgt->textureFBOID()));
14041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
14051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
14061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unknown resolve type");
14071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrGLIRect& glvp = tgt->getViewport();
14101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // the read rect is viewport-relative
14121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLIRect readRect;
14131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    readRect.setRelativeTo(glvp, left, top, width, height);
14141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t tightRowBytes = bpp * width;
14161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (0 == rowBytes) {
14171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rowBytes = tightRowBytes;
14181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    size_t readDstRowBytes = tightRowBytes;
14201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void* readDst = buffer;
14211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // determine if GL can read using the passed rowBytes or if we need
14231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // a scratch buffer.
14241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoSMalloc<32 * sizeof(GrColor)> scratch;
14251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (rowBytes != tightRowBytes) {
14264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (this->glCaps().packRowLengthSupport()) {
14271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(!(rowBytes % sizeof(GrColor)));
14281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, rowBytes / sizeof(GrColor)));
14291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            readDstRowBytes = rowBytes;
14301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
14311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scratch.reset(tightRowBytes * height);
14321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            readDst = scratch.get();
14331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
14341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (!invertY && this->glCaps().packFlipYSupport()) {
14361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, 1));
14371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(ReadPixels(readRect.fLeft, readRect.fBottom,
14391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                       readRect.fWidth, readRect.fHeight,
14401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                       format, type, readDst));
14411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (readDstRowBytes != tightRowBytes) {
14424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrAssert(this->glCaps().packRowLengthSupport());
14431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_PACK_ROW_LENGTH, 0));
14441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    if (!invertY && this->glCaps().packFlipYSupport()) {
14461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, 0));
14471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        invertY = true;
14481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // now reverse the order of the rows, since GL's are bottom-to-top, but our
14511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // API presents top-to-bottom. We must preserve the padding contents. Note
14521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // that the above readPixels did not overwrite the padding.
14531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (readDst == buffer) {
14541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(rowBytes == readDstRowBytes);
14551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!invertY) {
14561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            scratch.reset(tightRowBytes);
14571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            void* tmpRow = scratch.get();
14581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // flip y in-place by rows
14591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const int halfY = height >> 1;
14601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            char* top = reinterpret_cast<char*>(buffer);
14611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            char* bottom = top + (height - 1) * rowBytes;
14621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (int y = 0; y < halfY; y++) {
14631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                memcpy(tmpRow, top, tightRowBytes);
14641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                memcpy(top, bottom, tightRowBytes);
14651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                memcpy(bottom, tmpRow, tightRowBytes);
14661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                top += rowBytes;
14671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                bottom -= rowBytes;
14681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
14691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
14701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
14711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(readDst != buffer);        GrAssert(rowBytes != tightRowBytes);
14721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // copy from readDst to buffer while flipping y
14731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const int halfY = height >> 1;
14741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const char* src = reinterpret_cast<const char*>(readDst);
14751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        char* dst = reinterpret_cast<char*>(buffer);
14761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!invertY) {
14771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            dst += (height-1) * rowBytes;
14781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
14791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int y = 0; y < height; y++) {
14801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(dst, src, tightRowBytes);
14811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            src += readDstRowBytes;
14821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (invertY) {
14831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                dst += rowBytes;
14841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
14851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                dst -= rowBytes;
14861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
14871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
14881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
14891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
14901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
14911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::flushRenderTarget(const GrIRect* bound) {
14931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLRenderTarget* rt =
14951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static_cast<GrGLRenderTarget*>(this->drawState()->getRenderTarget());
14961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != rt);
14971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
14981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWDrawState.getRenderTarget() != rt) {
14991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, rt->renderFBOID()));
15001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_COLLECT_STATS
15011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ++fStats.fRenderTargetChngCnt;
15021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
15031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_DEBUG
15041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLenum status;
15051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
15061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
15071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrPrintf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x\n", status);
15081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
15091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
15101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fDirtyFlags.fRenderTargetChanged = true;
15111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setRenderTarget(rt);
15121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrGLIRect& vp = rt->getViewport();
15131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWBounds.fViewportRect != vp) {
15141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            vp.pushToGLViewport(this->glInterface());
15151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fViewportRect = vp;
15161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
15171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
15181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == bound || !bound->isEmpty()) {
15191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rt->flagAsNeedingResolve(bound);
15201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
15211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
15221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15231cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrGLenum gPrimitiveType2GLMode[] = {
15241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_TRIANGLES,
15251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_TRIANGLE_STRIP,
15261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_TRIANGLE_FAN,
15271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_POINTS,
15281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_LINES,
15291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_LINE_STRIP
15301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
15311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SWAP_PER_DRAW 0
15331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if SWAP_PER_DRAW
15351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_MAC_BUILD
15361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        #include <AGL/agl.h>
15371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #elif GR_WIN32_BUILD
15381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        void SwapBuf() {
15391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            DWORD procID = GetCurrentProcessId();
15401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            HWND hwnd = GetTopWindow(GetDesktopWindow());
15411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            while(hwnd) {
15421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                DWORD wndProcID = 0;
15431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GetWindowThreadProcessId(hwnd, &wndProcID);
15441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if(wndProcID == procID) {
15451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SwapBuffers(GetDC(hwnd));
15461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
15471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                hwnd = GetNextWindow(hwnd, GW_HWNDNEXT);
15481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
15491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger         }
15501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
15511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
15521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onGpuDrawIndexed(GrPrimitiveType type,
15541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint32_t startVertex,
15551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint32_t startIndex,
15561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint32_t vertexCount,
15571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               uint32_t indexCount) {
15581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((size_t)type < GR_ARRAY_COUNT(gPrimitiveType2GLMode));
15591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLvoid* indices = (GrGLvoid*)(sizeof(uint16_t) * startIndex);
15611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != fHWGeometryState.fIndexBuffer);
15631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != fHWGeometryState.fVertexBuffer);
15641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // our setupGeometry better have adjusted this to zero since
15661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // DrawElements always draws from the begining of the arrays for idx 0.
15671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(0 == startVertex);
15681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(DrawElements(gPrimitiveType2GLMode[type], indexCount,
15701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         GR_GL_UNSIGNED_SHORT, indices));
15711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if SWAP_PER_DRAW
15721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glFlush();
15731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_MAC_BUILD
15741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        aglSwapBuffers(aglGetCurrentContext());
15751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int set_a_break_pt_here = 9;
15761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        aglSwapBuffers(aglGetCurrentContext());
15771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #elif GR_WIN32_BUILD
15781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SwapBuf();
15791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int set_a_break_pt_here = 9;
15801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SwapBuf();
15811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
15821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
15831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
15841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::onGpuDrawNonIndexed(GrPrimitiveType type,
15861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  uint32_t startVertex,
15871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  uint32_t vertexCount) {
15881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((size_t)type < GR_ARRAY_COUNT(gPrimitiveType2GLMode));
15891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != fHWGeometryState.fVertexBuffer);
15911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // our setupGeometry better have adjusted this to zero.
15931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // DrawElements doesn't take an offset so we always adjus the startVertex.
15941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(0 == startVertex);
15951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // pass 0 for parameter first. We have to adjust gl*Pointer() to
15971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // account for startVertex in the DrawElements case. So we always
15981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // rely on setupGeometry to have accounted for startVertex.
15991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GL_CALL(DrawArrays(gPrimitiveType2GLMode[type], 0, vertexCount));
16001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if SWAP_PER_DRAW
16011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    glFlush();
16021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_MAC_BUILD
16031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        aglSwapBuffers(aglGetCurrentContext());
16041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int set_a_break_pt_here = 9;
16051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        aglSwapBuffers(aglGetCurrentContext());
16061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #elif GR_WIN32_BUILD
16071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SwapBuf();
16081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int set_a_break_pt_here = 9;
16091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SwapBuf();
16101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
16111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
16121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
16131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
16144f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergervoid GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) {
16154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
16164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target);
16171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
16181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (rt->needsResolve()) {
16194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        GrAssert(GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType());
16201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(rt->textureFBOID() != rt->renderFBOID());
16211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER,
16221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                rt->renderFBOID()));
16231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER,
16241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                rt->textureFBOID()));
16251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_COLLECT_STATS
16261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        ++fStats.fRenderTargetChngCnt;
16271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
16281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // make sure we go through flushRenderTarget() since we've modified
16291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // the bound DRAW FBO ID.
16301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setRenderTarget(NULL);
16311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrGLIRect& vp = rt->getViewport();
16321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const GrIRect dirtyRect = rt->getResolveRect();
16331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLIRect r;
16341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        r.setRelativeTo(vp, dirtyRect.fLeft, dirtyRect.fTop,
16351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        dirtyRect.width(), dirtyRect.height());
16361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
16374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        if (GrGLCaps::kAppleES_MSFBOType == this->glCaps().msFBOType()) {
16381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Apple's extension uses the scissor as the blit bounds.
16391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Enable(GR_GL_SCISSOR_TEST));
16401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Scissor(r.fLeft, r.fBottom,
16411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            r.fWidth, r.fHeight));
16421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(ResolveMultisampleFramebuffer());
16431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fScissorRect.invalidate();
16441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBounds.fScissorEnabled = true;
16451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
16464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (GrGLCaps::kDesktopARB_MSFBOType != this->glCaps().msFBOType()) {
16471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // this respects the scissor during the blit, so disable it.
16484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                GrAssert(GrGLCaps::kDesktopEXT_MSFBOType ==
16494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                         this->glCaps().msFBOType());
16501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                this->flushScissor(NULL);
16511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
16521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int right = r.fLeft + r.fWidth;
16531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int top = r.fBottom + r.fHeight;
16541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(BlitFramebuffer(r.fLeft, r.fBottom, right, top,
16551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    r.fLeft, r.fBottom, right, top,
16561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST));
16571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
16581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rt->flagAsResolved();
16591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
16601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
16611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
16621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrGLenum grToGLStencilFunc[] = {
16631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ALWAYS,           // kAlways_StencilFunc
16641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_NEVER,            // kNever_StencilFunc
16651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_GREATER,          // kGreater_StencilFunc
16661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_GEQUAL,           // kGEqual_StencilFunc
16671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_LESS,             // kLess_StencilFunc
16681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_LEQUAL,           // kLEqual_StencilFunc,
16691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_EQUAL,            // kEqual_StencilFunc,
16701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_NOTEQUAL,         // kNotEqual_StencilFunc,
16711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
16721cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(GR_ARRAY_COUNT(grToGLStencilFunc) == kBasicStencilFuncCount);
16731cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(0 == kAlways_StencilFunc);
16741cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(1 == kNever_StencilFunc);
16751cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(2 == kGreater_StencilFunc);
16761cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(3 == kGEqual_StencilFunc);
16771cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(4 == kLess_StencilFunc);
16781cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(5 == kLEqual_StencilFunc);
16791cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(6 == kEqual_StencilFunc);
16801cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(7 == kNotEqual_StencilFunc);
16811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
16821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrGLenum grToGLStencilOp[] = {
16831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_KEEP,        // kKeep_StencilOp
16841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_REPLACE,     // kReplace_StencilOp
16851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_INCR_WRAP,   // kIncWrap_StencilOp
16861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_INCR,        // kIncClamp_StencilOp
16871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_DECR_WRAP,   // kDecWrap_StencilOp
16881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_DECR,        // kDecClamp_StencilOp
16891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_ZERO,        // kZero_StencilOp
16901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_INVERT,      // kInvert_StencilOp
16911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
16921cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(GR_ARRAY_COUNT(grToGLStencilOp) == kStencilOpCount);
16931cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(0 == kKeep_StencilOp);
16941cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(1 == kReplace_StencilOp);
16951cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(2 == kIncWrap_StencilOp);
16961cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(3 == kIncClamp_StencilOp);
16971cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(4 == kDecWrap_StencilOp);
16981cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(5 == kDecClamp_StencilOp);
16991cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(6 == kZero_StencilOp);
17001cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_STATIC_ASSERT(7 == kInvert_StencilOp);
17011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::flushStencil() {
17031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrDrawState& drawState = this->getDrawState();
17041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrStencilSettings* settings = &drawState.getStencil();
17061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // use stencil for clipping if clipping is enabled and the clip
17081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // has been written into the stencil.
17091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool stencilClip = fClipInStencil && drawState.isClipState();
17101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool drawClipToStencil =
17111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        drawState.isStateFlagEnabled(kModifyStencilClip_StateBit);
17121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool stencilChange = (fHWDrawState.getStencil() != *settings) ||
17131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         (fHWStencilClip != stencilClip) ||
17141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         (fHWDrawState.isStateFlagEnabled(kModifyStencilClip_StateBit) !=
17151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          drawClipToStencil);
17161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (stencilChange) {
17181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we can't simultaneously perform stencil-clipping and
17201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // modify the stencil clip
17211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(!stencilClip || !drawClipToStencil);
17221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (settings->isDisabled()) {
17241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (stencilClip) {
17254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                settings = GetClipStencilSettings();
17261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
17271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
17281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (settings->isDisabled()) {
17301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Disable(GR_GL_STENCIL_TEST));
17311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
17321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Enable(GR_GL_STENCIL_TEST));
17331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #if GR_DEBUG
17341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (!this->getCaps().fStencilWrapOpsSupport) {
17351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->frontPassOp() != kIncWrap_StencilOp);
17361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->frontPassOp() != kDecWrap_StencilOp);
17371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->frontFailOp() != kIncWrap_StencilOp);
17381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->backFailOp() != kDecWrap_StencilOp);
17391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->backPassOp() != kIncWrap_StencilOp);
17401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->backPassOp() != kDecWrap_StencilOp);
17411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->backFailOp() != kIncWrap_StencilOp);
17421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->frontFailOp() != kDecWrap_StencilOp);
17431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
17441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #endif
17451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            int stencilBits = 0;
17461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrStencilBuffer* stencilBuffer =
17471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                drawState.getRenderTarget()->getStencilBuffer();
17481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (NULL != stencilBuffer) {
17491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                stencilBits = stencilBuffer->bits();
17501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
17511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // TODO: dynamically attach a stencil buffer
17521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(stencilBits || settings->isDisabled());
17531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLuint clipStencilMask = 0;
17551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLuint userStencilMask = ~0;
17561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (stencilBits > 0) {
17571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                clipStencilMask =  1 << (stencilBits - 1);
17581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                userStencilMask = clipStencilMask - 1;
17591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
17601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            unsigned int frontRef  = settings->frontFuncRef();
17621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            unsigned int frontMask = settings->frontFuncMask();
17631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            unsigned int frontWriteMask = settings->frontWriteMask();
17641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLenum frontFunc;
17651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (drawClipToStencil) {
17671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrAssert(settings->frontFunc() < kBasicStencilFuncCount);
17681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                frontFunc = grToGLStencilFunc[settings->frontFunc()];
17691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
17701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                frontFunc = grToGLStencilFunc[ConvertStencilFunc(
17711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        stencilClip, settings->frontFunc())];
17721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                ConvertStencilFuncAndMask(settings->frontFunc(),
17741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          stencilClip,
17751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          clipStencilMask,
17761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          userStencilMask,
17771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          &frontRef,
17781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                          &frontMask);
17791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                frontWriteMask &= userStencilMask;
17801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
17811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert((size_t)
17821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                settings->frontFailOp() < GR_ARRAY_COUNT(grToGLStencilOp));
17831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert((size_t)
17841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                settings->frontPassOp() < GR_ARRAY_COUNT(grToGLStencilOp));
17851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert((size_t)
17861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                settings->backFailOp() < GR_ARRAY_COUNT(grToGLStencilOp));
17871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert((size_t)
17881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                settings->backPassOp() < GR_ARRAY_COUNT(grToGLStencilOp));
17891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (this->getCaps().fTwoSidedStencilSupport) {
17901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrGLenum backFunc;
17911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                unsigned int backRef  = settings->backFuncRef();
17931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                unsigned int backMask = settings->backFuncMask();
17941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                unsigned int backWriteMask = settings->backWriteMask();
17951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
17971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (drawClipToStencil) {
17981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrAssert(settings->backFunc() < kBasicStencilFuncCount);
17991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    backFunc = grToGLStencilFunc[settings->backFunc()];
18001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
18011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    backFunc = grToGLStencilFunc[ConvertStencilFunc(
18021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        stencilClip, settings->backFunc())];
18031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    ConvertStencilFuncAndMask(settings->backFunc(),
18041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              stencilClip,
18051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              clipStencilMask,
18061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              userStencilMask,
18071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              &backRef,
18081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              &backMask);
18091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    backWriteMask &= userStencilMask;
18101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
18111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilFuncSeparate(GR_GL_FRONT, frontFunc,
18131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                            frontRef, frontMask));
18141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilMaskSeparate(GR_GL_FRONT, frontWriteMask));
18151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilFuncSeparate(GR_GL_BACK, backFunc,
18161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                            backRef, backMask));
18171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilMaskSeparate(GR_GL_BACK, backWriteMask));
18181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilOpSeparate(GR_GL_FRONT,
18191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->frontFailOp()],
18201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->frontPassOp()],
18211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->frontPassOp()]));
18221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilOpSeparate(GR_GL_BACK,
18241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->backFailOp()],
18251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->backPassOp()],
18261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    grToGLStencilOp[settings->backPassOp()]));
18271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
18281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilFunc(frontFunc, frontRef, frontMask));
18291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilMask(frontWriteMask));
18301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(StencilOp(grToGLStencilOp[settings->frontFailOp()],
18311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                grToGLStencilOp[settings->frontPassOp()],
18321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                grToGLStencilOp[settings->frontPassOp()]));
18331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
18341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
18351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *fHWDrawState.stencil() = *settings;
18361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWStencilClip = stencilClip;
18371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
18381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
18391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::flushAAState(GrPrimitiveType type) {
18411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GrRenderTarget* rt = this->getDrawState().getRenderTarget();
18421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (kDesktop_GrGLBinding == this->glBinding()) {
18431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // ES doesn't support toggling GL_MULTISAMPLE and doesn't have
18441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // smooth lines.
18451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // we prefer smooth lines over multisampled lines
18471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // msaa should be disabled if drawing smooth lines.
18481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (GrIsPrimTypeLines(type)) {
18491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            bool smooth = this->willUseHWAALines();
18501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (!fHWAAState.fSmoothLineEnabled && smooth) {
18511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Enable(GR_GL_LINE_SMOOTH));
18521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fSmoothLineEnabled = true;
18531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else if (fHWAAState.fSmoothLineEnabled && !smooth) {
18541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Disable(GR_GL_LINE_SMOOTH));
18551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fSmoothLineEnabled = false;
18561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
18571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (rt->isMultisampled() &&
18581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fMSAAEnabled) {
18591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Disable(GR_GL_MULTISAMPLE));
18601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fMSAAEnabled = false;
18611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
18621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else if (rt->isMultisampled() &&
18631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   this->getDrawState().isHWAntialiasState() !=
18641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   fHWAAState.fMSAAEnabled) {
18651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (fHWAAState.fMSAAEnabled) {
18661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Disable(GR_GL_MULTISAMPLE));
18671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fMSAAEnabled = false;
18681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
18691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Enable(GR_GL_MULTISAMPLE));
18701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWAAState.fMSAAEnabled = true;
18711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
18721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
18731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
18741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
18751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
18761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::flushBlend(GrPrimitiveType type,
18771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         GrBlendCoeff srcCoeff,
18781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         GrBlendCoeff dstCoeff) {
18791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GrIsPrimTypeLines(type) && this->willUseHWAALines()) {
18801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWBlendDisabled) {
18811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Enable(GR_GL_BLEND));
18821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBlendDisabled = false;
18831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
18841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (kSA_BlendCoeff != fHWDrawState.getSrcBlendCoeff() ||
18851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            kISA_BlendCoeff != fHWDrawState.getDstBlendCoeff()) {
18861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(BlendFunc(gXfermodeCoeff2Blend[kSA_BlendCoeff],
18871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                              gXfermodeCoeff2Blend[kISA_BlendCoeff]));
18881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWDrawState.setBlendFunc(kSA_BlendCoeff, kISA_BlendCoeff);
18891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
18901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
18911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // any optimization to disable blending should
18921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // have already been applied and tweaked the coeffs
18931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // to (1, 0).
18941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bool blendOff = kOne_BlendCoeff == srcCoeff &&
18951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        kZero_BlendCoeff == dstCoeff;
18961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWBlendDisabled != blendOff) {
18971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (blendOff) {
18981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Disable(GR_GL_BLEND));
18991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
19001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Enable(GR_GL_BLEND));
19011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
19021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWBlendDisabled = blendOff;
19031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
19041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (!blendOff) {
19051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (fHWDrawState.getSrcBlendCoeff() != srcCoeff ||
19061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWDrawState.getDstBlendCoeff() != dstCoeff) {
19071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(BlendFunc(gXfermodeCoeff2Blend[srcCoeff],
19081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                  gXfermodeCoeff2Blend[dstCoeff]));
19091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWDrawState.setBlendFunc(srcCoeff, dstCoeff);
19101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
19111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrColor blendConst = fCurrDrawState.getBlendConstant();
19121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if ((BlendCoeffReferencesConstant(srcCoeff) ||
19131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 BlendCoeffReferencesConstant(dstCoeff)) &&
19141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWDrawState.getBlendConstant() != blendConst) {
19151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                float c[] = {
19171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrColorUnpackR(blendConst) / 255.f,
19181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrColorUnpackG(blendConst) / 255.f,
19191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrColorUnpackB(blendConst) / 255.f,
19201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    GrColorUnpackA(blendConst) / 255.f
19211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                };
19221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(BlendColor(c[0], c[1], c[2], c[3]));
19231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWDrawState.setBlendConstant(blendConst);
19241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
19251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
19261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
19271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
19281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace {
19301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerunsigned gr_to_gl_filter(GrSamplerState::Filter filter) {
19321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (filter) {
19331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrSamplerState::kBilinear_Filter:
19341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrSamplerState::k4x4Downsample_Filter:
19351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return GR_GL_LINEAR;
19361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrSamplerState::kNearest_Filter:
19371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case GrSamplerState::kConvolution_Filter:
19384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        case GrSamplerState::kErode_Filter:
19394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        case GrSamplerState::kDilate_Filter:
19401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return GR_GL_NEAREST;
19411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
19421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(!"Unknown filter type");
19431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return GR_GL_LINEAR;
19441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
19451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
19461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerconst GrGLenum* get_swizzle(GrPixelConfig config,
19481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            const GrSamplerState& sampler) {
19491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (GrPixelConfigIsAlphaOnly(config)) {
19501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const GrGLenum gAlphaSmear[] = { GR_GL_ALPHA, GR_GL_ALPHA,
19511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                GR_GL_ALPHA, GR_GL_ALPHA };
19521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return gAlphaSmear;
19531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else if (sampler.swapsRAndB()) {
19541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const GrGLenum gRedBlueSwap[] = { GR_GL_BLUE, GR_GL_GREEN,
19551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                 GR_GL_RED,  GR_GL_ALPHA };
19561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return gRedBlueSwap;
19571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    } else {
19581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const GrGLenum gStraight[] = { GR_GL_RED, GR_GL_GREEN,
19591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              GR_GL_BLUE,  GR_GL_ALPHA };
19601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return gStraight;
19611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
19621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
19631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid set_tex_swizzle(GrGLenum swizzle[4], const GrGLInterface* gl) {
19651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // should add texparameteri to interface to make 1 instead of 4 calls here
19661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D,
19671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_SWIZZLE_R,
19681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 swizzle[0]));
19691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D,
19701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_SWIZZLE_G,
19711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 swizzle[1]));
19721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D,
19731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_SWIZZLE_B,
19741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 swizzle[2]));
19751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GR_GL_CALL(gl, TexParameteri(GR_GL_TEXTURE_2D,
19761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 GR_GL_TEXTURE_SWIZZLE_A,
19771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 swizzle[3]));
19781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
19791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
19801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::flushGLStateCommon(GrPrimitiveType type) {
19821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState* drawState = this->drawState();
19841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // GrGpu::setupClipAndFlushState should have already checked this
19851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // and bailed if not true.
19861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != drawState->getRenderTarget());
19871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
19891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // bind texture and set sampler state
19901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (this->isStageEnabled(s)) {
19911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLTexture* nextTexture =
19921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                static_cast<GrGLTexture*>(drawState->getTexture(s));
19931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
19941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // true for now, but maybe not with GrEffect.
19951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrAssert(NULL != nextTexture);
19961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // if we created a rt/tex and rendered to it without using a
19971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // texture and now we're texuring from the rt it will still be
19981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // the last bound texture, but it needs resolving. So keep this
19991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // out of the "last != next" check.
20001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLRenderTarget* texRT =
20011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                static_cast<GrGLRenderTarget*>(nextTexture->asRenderTarget());
20021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (NULL != texRT) {
20034f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger                this->onResolveRenderTarget(texRT);
20041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (fHWDrawState.getTexture(s) != nextTexture) {
20071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                setTextureUnit(s);
20081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(BindTexture(GR_GL_TEXTURE_2D, nextTexture->textureID()));
20091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #if GR_COLLECT_STATS
20101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                ++fStats.fTextureChngCnt;
20111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            #endif
20121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                //GrPrintf("---- bindtexture %d\n", nextTexture->textureID());
20131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fHWDrawState.setTexture(s, nextTexture);
20141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // The texture matrix has to compensate for texture width/height
20151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // and NPOT-embedded-in-POT
20161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                fDirtyFlags.fTextureChangedMask |= (1 << s);
20171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const GrSamplerState& sampler = drawState->getSampler(s);
20201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ResetTimestamp timestamp;
20211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const GrGLTexture::TexParams& oldTexParams =
20221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    nextTexture->getCachedTexParams(&timestamp);
20231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            bool setAll = timestamp < this->getResetTimestamp();
20241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrGLTexture::TexParams newTexParams;
20251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            newTexParams.fFilter = gr_to_gl_filter(sampler.getFilter());
20271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const GrGLenum* wraps =  GrGLTexture::WrapMode2GLWrap();
20291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            newTexParams.fWrapS = wraps[sampler.getWrapX()];
20301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            newTexParams.fWrapT = wraps[sampler.getWrapY()];
20311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            memcpy(newTexParams.fSwizzleRGBA,
20321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   get_swizzle(nextTexture->config(), sampler),
20331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   sizeof(newTexParams.fSwizzleRGBA));
20341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (setAll || newTexParams.fFilter != oldTexParams.fFilter) {
20351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                setTextureUnit(s);
20361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
20371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_TEXTURE_MAG_FILTER,
20381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        newTexParams.fFilter));
20391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
20401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_TEXTURE_MIN_FILTER,
20411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        newTexParams.fFilter));
20421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (setAll || newTexParams.fWrapS != oldTexParams.fWrapS) {
20441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                setTextureUnit(s);
20451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
20461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_TEXTURE_WRAP_S,
20471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        newTexParams.fWrapS));
20481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (setAll || newTexParams.fWrapT != oldTexParams.fWrapT) {
20501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                setTextureUnit(s);
20511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
20521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        GR_GL_TEXTURE_WRAP_T,
20531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                        newTexParams.fWrapT));
20541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (this->glCaps().textureSwizzleSupport() &&
20561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                (setAll ||
20571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 memcmp(newTexParams.fSwizzleRGBA,
20581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        oldTexParams.fSwizzleRGBA,
20591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                        sizeof(newTexParams.fSwizzleRGBA)))) {
20601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                setTextureUnit(s);
20611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                set_tex_swizzle(newTexParams.fSwizzleRGBA,
20621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                this->glInterface());
20631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
20641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            nextTexture->setCachedTexParams(newTexParams,
20651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                            this->getResetTimestamp());
20661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
20671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
20681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrIRect* rect = NULL;
20701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrIRect clipBounds;
20711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (drawState->isClipState() &&
20721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fClip.hasConservativeBounds()) {
20731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fClip.getConservativeBounds().roundOut(&clipBounds);
20741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rect = &clipBounds;
20751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
20761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushRenderTarget(rect);
20771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushAAState(type);
20781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (drawState->isDitherState() != fHWDrawState.isDitherState()) {
20801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (drawState->isDitherState()) {
20811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Enable(GR_GL_DITHER));
20821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
20831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(Disable(GR_GL_DITHER));
20841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
20851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
20861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (drawState->isColorWriteDisabled() !=
20881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.isColorWriteDisabled()) {
20891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLenum mask;
20901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (drawState->isColorWriteDisabled()) {
20911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            mask = GR_GL_FALSE;
20921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        } else {
20931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            mask = GR_GL_TRUE;
20941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
20951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(ColorMask(mask, mask, mask, mask));
20961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
20971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWDrawState.getDrawFace() != drawState->getDrawFace()) {
20991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        switch (fCurrDrawState.getDrawFace()) {
21001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case GrDrawState::kCCW_DrawFace:
21011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Enable(GR_GL_CULL_FACE));
21021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(CullFace(GR_GL_BACK));
21031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
21041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case GrDrawState::kCW_DrawFace:
21051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Enable(GR_GL_CULL_FACE));
21061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(CullFace(GR_GL_FRONT));
21071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
21081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            case GrDrawState::kBoth_DrawFace:
21091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GL_CALL(Disable(GR_GL_CULL_FACE));
21101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                break;
21111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            default:
21121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                GrCrash("Unknown draw face.");
21131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
21141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setDrawFace(drawState->getDrawFace());
21151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if GR_DEBUG
21181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // check for circular rendering
21191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
21201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(!this->isStageEnabled(s) ||
21211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 NULL == drawState->getRenderTarget() ||
21221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 NULL == drawState->getTexture(s) ||
21231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 drawState->getTexture(s)->asRenderTarget() !=
21241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    drawState->getRenderTarget());
21251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
21271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    this->flushStencil();
21291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // This copy must happen after flushStencil() is called. flushStencil()
21311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // relies on detecting when the kModifyStencilClip_StateBit state has
21321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // changed since the last draw.
21331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWDrawState.copyStateFlags(*drawState);
21341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
21351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyVertexBufferBind(const GrGLVertexBuffer* buffer) {
21381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWGeometryState.fVertexBuffer != buffer) {
21391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fArrayPtrsDirty = true;
21401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fVertexBuffer = buffer;
21411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyVertexBufferDelete(const GrGLVertexBuffer* buffer) {
21451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWGeometryState.fVertexBuffer == buffer) {
21461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // deleting bound buffer does implied bind to 0
21471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fVertexBuffer = NULL;
21481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fArrayPtrsDirty = true;
21491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyIndexBufferBind(const GrGLIndexBuffer* buffer) {
21531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    fHWGeometryState.fIndexBuffer = buffer;
21541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyIndexBufferDelete(const GrGLIndexBuffer* buffer) {
21571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWGeometryState.fIndexBuffer == buffer) {
21581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // deleting bound buffer does implied bind to 0
21591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fIndexBuffer = NULL;
21601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyRenderTargetDelete(GrRenderTarget* renderTarget) {
21641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != renderTarget);
21651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrDrawState* drawState = this->drawState();
21661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (drawState->getRenderTarget() == renderTarget) {
21671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        drawState->setRenderTarget(NULL);
21681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWDrawState.getRenderTarget() == renderTarget) {
21701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWDrawState.setRenderTarget(NULL);
21711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::notifyTextureDelete(GrGLTexture* texture) {
21751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int s = 0; s < GrDrawState::kNumStages; ++s) {
21761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrDrawState* drawState = this->drawState();
21771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (drawState->getTexture(s) == texture) {
21781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fCurrDrawState.setTexture(s, NULL);
21791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
21801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWDrawState.getTexture(s) == texture) {
21811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // deleting bound texture does implied bind to 0
21821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWDrawState.setTexture(s, NULL);
21831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger       }
21841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
21861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool GrGpuGL::configToGLFormats(GrPixelConfig config,
21881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                bool getSizedInternalFormat,
21891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                GrGLenum* internalFormat,
21901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                GrGLenum* externalFormat,
21911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                GrGLenum* externalType) {
21921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLenum dontCare;
21931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == internalFormat) {
21941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        internalFormat = &dontCare;
21951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == externalFormat) {
21971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        externalFormat = &dontCare;
21981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
21991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (NULL == externalType) {
22001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        externalType = &dontCare;
22011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
22021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
22031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
22041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_PM_GrPixelConfig:
22051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
22061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *internalFormat = GR_GL_RGBA;
22071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalFormat = GR_GL_RGBA;
22081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (getSizedInternalFormat) {
22091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_RGBA8;
22101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_RGBA;
22121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalType = GR_GL_UNSIGNED_BYTE;
22141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_PM_GrPixelConfig:
22161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
22174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (!this->glCaps().bgraFormatSupport()) {
22181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                return false;
22191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger            if (this->glCaps().bgraIsInternalFormat()) {
22211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (getSizedInternalFormat) {
22221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    *internalFormat = GR_GL_BGRA8;
22231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
22241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    *internalFormat = GR_GL_BGRA;
22251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
22261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (getSizedInternalFormat) {
22281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    *internalFormat = GR_GL_RGBA8;
22291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
22301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    *internalFormat = GR_GL_RGBA;
22311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
22321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalFormat = GR_GL_BGRA;
22341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalType = GR_GL_UNSIGNED_BYTE;
22351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGB_565_GrPixelConfig:
22371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *internalFormat = GR_GL_RGB;
22381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalFormat = GR_GL_RGB;
22391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (getSizedInternalFormat) {
22401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if (this->glBinding() == kDesktop_GrGLBinding) {
22411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    return false;
22421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                } else {
22431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    *internalFormat = GR_GL_RGB565;
22441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
22451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_RGB;
22471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalType = GR_GL_UNSIGNED_SHORT_5_6_5;
22491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_4444_GrPixelConfig:
22511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *internalFormat = GR_GL_RGBA;
22521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalFormat = GR_GL_RGBA;
22531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (getSizedInternalFormat) {
22541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_RGBA4;
22551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_RGBA;
22571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalType = GR_GL_UNSIGNED_SHORT_4_4_4_4;
22591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kIndex_8_GrPixelConfig:
22611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (this->getCaps().f8BitPaletteSupport) {
22621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_PALETTE8_RGBA8;
22631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // glCompressedTexImage doesn't take external params
22641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *externalFormat = GR_GL_PALETTE8_RGBA8;
22651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // no sized/unsized internal format distinction here
22661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_PALETTE8_RGBA8;
22671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                // unused with CompressedTexImage
22681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *externalType = GR_GL_UNSIGNED_BYTE;
22691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                return false;
22711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kAlpha_8_GrPixelConfig:
22741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *internalFormat = GR_GL_ALPHA;
22751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalFormat = GR_GL_ALPHA;
22761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (getSizedInternalFormat) {
22771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_ALPHA8;
22781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
22791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                *internalFormat = GR_GL_ALPHA;
22801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
22811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *externalType = GR_GL_UNSIGNED_BYTE;
22821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
22831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
22841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
22851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
22861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return true;
22871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
22881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
22891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::setTextureUnit(int unit) {
22901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(unit >= 0 && unit < GrDrawState::kNumStages);
22911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fActiveTextureUnitIdx != unit) {
22921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit));
22931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fActiveTextureUnitIdx = unit;
22941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
22951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
22961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
22971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::setSpareTextureUnit() {
22981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fActiveTextureUnitIdx != (GR_GL_TEXTURE0 + SPARE_TEX_UNIT)) {
22991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + SPARE_TEX_UNIT));
23001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fActiveTextureUnitIdx = SPARE_TEX_UNIT;
23011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
23021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
23031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::resetDirtyFlags() {
23051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Gr_bzero(&fDirtyFlags, sizeof(fDirtyFlags));
23061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
23071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergervoid GrGpuGL::setBuffers(bool indexed,
23091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         int* extraVertexOffset,
23101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         int* extraIndexOffset) {
23111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != extraVertexOffset);
23131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const GeometryPoolState& geoPoolState = this->getGeomPoolState();
23151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrGLVertexBuffer* vbuf;
23171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (this->getGeomSrc().fVertexSrc) {
23181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case kBuffer_GeometrySrcType:
23191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *extraVertexOffset = 0;
23201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer;
23211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
23221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case kArray_GeometrySrcType:
23231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    case kReserved_GeometrySrcType:
23241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->finalizeReservedVertices();
23251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        *extraVertexOffset = geoPoolState.fPoolStartVertex;
23261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        vbuf = (GrGLVertexBuffer*) geoPoolState.fPoolVertexBuffer;
23271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        break;
23281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    default:
23291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        vbuf = NULL; // suppress warning
23301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrCrash("Unknown geometry src type!");
23311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
23321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(NULL != vbuf);
23341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(!vbuf->isLocked());
23351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (fHWGeometryState.fVertexBuffer != vbuf) {
23361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GL_CALL(BindBuffer(GR_GL_ARRAY_BUFFER, vbuf->bufferID()));
23371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fArrayPtrsDirty = true;
23381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fHWGeometryState.fVertexBuffer = vbuf;
23391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
23401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    if (indexed) {
23421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(NULL != extraIndexOffset);
23431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrGLIndexBuffer* ibuf;
23451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        switch (this->getGeomSrc().fIndexSrc) {
23461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBuffer_GeometrySrcType:
23471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *extraIndexOffset = 0;
23481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ibuf = (GrGLIndexBuffer*)this->getGeomSrc().fIndexBuffer;
23491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
23501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kArray_GeometrySrcType:
23511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kReserved_GeometrySrcType:
23521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            this->finalizeReservedIndices();
23531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            *extraIndexOffset = geoPoolState.fPoolStartIndex;
23541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ibuf = (GrGLIndexBuffer*) geoPoolState.fPoolIndexBuffer;
23551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            break;
23561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
23571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            ibuf = NULL; // suppress warning
23581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GrCrash("Unknown geometry src type!");
23591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
23601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(NULL != ibuf);
23621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        GrAssert(!ibuf->isLocked());
23631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fHWGeometryState.fIndexBuffer != ibuf) {
23641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            GL_CALL(BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, ibuf->bufferID()));
23651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            fHWGeometryState.fIndexBuffer = ibuf;
23661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
23671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
23681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
23691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
23701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerint GrGpuGL::getMaxEdges() const {
23711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // FIXME:  This is a pessimistic estimate based on how many other things
23721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // want to add uniforms.  This should be centralized somewhere.
23734f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    return GR_CT_MIN(this->glCaps().maxFragmentUniformVectors() - 8,
23741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     GrDrawState::kMaxEdges);
23751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
23761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2377