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(×tamp); 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