| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 | 8 |
| 9 #include "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
| 10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 | 146 |
| 147 return status == GR_GL_FRAMEBUFFER_COMPLETE; | 147 return status == GR_GL_FRAMEBUFFER_COMPLETE; |
| 148 } | 148 } |
| 149 | 149 |
| 150 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) | 150 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) |
| 151 : GrGpu(context) | 151 : GrGpu(context) |
| 152 , fGLContext(ctx) { | 152 , fGLContext(ctx) { |
| 153 | 153 |
| 154 GrAssert(ctx.isInitialized()); | 154 GrAssert(ctx.isInitialized()); |
| 155 | 155 |
| 156 fCaps.reset(SkRef(ctx.info().caps())); |
| 157 |
| 156 fillInConfigRenderableTable(); | 158 fillInConfigRenderableTable(); |
| 157 | 159 |
| 158 fPrintedCaps = false; | |
| 159 | 160 |
| 160 GrGLClearErr(fGLContext.interface()); | 161 GrGLClearErr(fGLContext.interface()); |
| 161 | 162 |
| 162 if (gPrintStartupSpew) { | 163 if (gPrintStartupSpew) { |
| 163 const GrGLubyte* ext; | 164 const GrGLubyte* ext; |
| 164 GL_CALL_RET(ext, GetString(GR_GL_EXTENSIONS)); | 165 GL_CALL_RET(ext, GetString(GR_GL_EXTENSIONS)); |
| 165 const GrGLubyte* vendor; | 166 const GrGLubyte* vendor; |
| 166 const GrGLubyte* renderer; | 167 const GrGLubyte* renderer; |
| 167 const GrGLubyte* version; | 168 const GrGLubyte* version; |
| 168 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); | 169 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); |
| 169 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); | 170 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); |
| 170 GL_CALL_RET(version, GetString(GR_GL_VERSION)); | 171 GL_CALL_RET(version, GetString(GR_GL_VERSION)); |
| 171 GrPrintf("------------------------- create GrGpuGL %p --------------\n", | 172 GrPrintf("------------------------- create GrGpuGL %p --------------\n", |
| 172 this); | 173 this); |
| 173 GrPrintf("------ VENDOR %s\n", vendor); | 174 GrPrintf("------ VENDOR %s\n", vendor); |
| 174 GrPrintf("------ RENDERER %s\n", renderer); | 175 GrPrintf("------ RENDERER %s\n", renderer); |
| 175 GrPrintf("------ VERSION %s\n", version); | 176 GrPrintf("------ VERSION %s\n", version); |
| 176 GrPrintf("------ EXTENSIONS\n %s \n", ext); | 177 GrPrintf("------ EXTENSIONS\n %s \n", ext); |
| 178 ctx.info().caps()->print(); |
| 177 } | 179 } |
| 178 | 180 |
| 179 this->initCaps(); | |
| 180 | |
| 181 fProgramCache = SkNEW_ARGS(ProgramCache, (this->glContext())); | 181 fProgramCache = SkNEW_ARGS(ProgramCache, (this->glContext())); |
| 182 | 182 |
| 183 GrAssert(this->glCaps().maxVertexAttributes() >= GrDrawState::kVertexAttribC
nt); | 183 GrAssert(this->glCaps().maxVertexAttributes() >= GrDrawState::kVertexAttribC
nt); |
| 184 GrAssert(this->glCaps().maxVertexAttributes() > GrDrawState::kColorOverrideA
ttribIndexValue); | 184 GrAssert(this->glCaps().maxVertexAttributes() > GrDrawState::kColorOverrideA
ttribIndexValue); |
| 185 GrAssert(this->glCaps().maxVertexAttributes() > GrDrawState::kCoverageOverri
deAttribIndexValue); | 185 GrAssert(this->glCaps().maxVertexAttributes() > GrDrawState::kCoverageOverri
deAttribIndexValue); |
| 186 | 186 |
| 187 fLastSuccessfulStencilFmtIdx = 0; | 187 fLastSuccessfulStencilFmtIdx = 0; |
| 188 if (false) { // avoid bit rot, suppress warning | 188 if (false) { // avoid bit rot, suppress warning |
| 189 fbo_test(this->glInterface(), 0, 0); | 189 fbo_test(this->glInterface(), 0, 0); |
| 190 } | 190 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 202 | 202 |
| 203 // This must be called by before the GrDrawTarget destructor | 203 // This must be called by before the GrDrawTarget destructor |
| 204 this->releaseGeometry(); | 204 this->releaseGeometry(); |
| 205 // This subclass must do this before the base class destructor runs | 205 // This subclass must do this before the base class destructor runs |
| 206 // since we will unref the GrGLInterface. | 206 // since we will unref the GrGLInterface. |
| 207 this->releaseResources(); | 207 this->releaseResources(); |
| 208 } | 208 } |
| 209 | 209 |
| 210 /////////////////////////////////////////////////////////////////////////////// | 210 /////////////////////////////////////////////////////////////////////////////// |
| 211 | 211 |
| 212 void GrGpuGL::initCaps() { | |
| 213 GrGLint maxTextureUnits; | |
| 214 // check FS and fixed-function texture unit limits | |
| 215 // we only use textures in the fragment stage currently. | |
| 216 // checks are > to make sure we have a spare unit. | |
| 217 const GrGLInterface* gl = this->glInterface(); | |
| 218 GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); | |
| 219 GrAssert(maxTextureUnits > GrDrawState::kNumStages); | |
| 220 | |
| 221 CapsInternals* caps = this->capsInternals(); | |
| 222 | |
| 223 GrGLint numFormats; | |
| 224 GR_GL_GetIntegerv(gl, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats); | |
| 225 SkAutoSTMalloc<10, GrGLint> formats(numFormats); | |
| 226 GR_GL_GetIntegerv(gl, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats); | |
| 227 for (int i = 0; i < numFormats; ++i) { | |
| 228 if (formats[i] == GR_GL_PALETTE8_RGBA8) { | |
| 229 caps->f8BitPaletteSupport = true; | |
| 230 break; | |
| 231 } | |
| 232 } | |
| 233 | |
| 234 if (kDesktop_GrGLBinding == this->glBinding()) { | |
| 235 // we could also look for GL_ATI_separate_stencil extension or | |
| 236 // GL_EXT_stencil_two_side but they use different function signatures | |
| 237 // than GL2.0+ (and than each other). | |
| 238 caps->fTwoSidedStencilSupport = (this->glVersion() >= GR_GL_VER(2,0)); | |
| 239 // supported on GL 1.4 and higher or by extension | |
| 240 caps->fStencilWrapOpsSupport = (this->glVersion() >= GR_GL_VER(1,4)) || | |
| 241 this->hasExtension("GL_EXT_stencil_wrap")
; | |
| 242 } else { | |
| 243 // ES 2 has two sided stencil and stencil wrap | |
| 244 caps->fTwoSidedStencilSupport = true; | |
| 245 caps->fStencilWrapOpsSupport = true; | |
| 246 } | |
| 247 | |
| 248 if (kDesktop_GrGLBinding == this->glBinding()) { | |
| 249 caps->fBufferLockSupport = true; // we require VBO support and the deskt
op VBO | |
| 250 // extension includes glMapBuffer. | |
| 251 } else { | |
| 252 caps->fBufferLockSupport = this->hasExtension("GL_OES_mapbuffer"); | |
| 253 } | |
| 254 | |
| 255 if (kDesktop_GrGLBinding == this->glBinding()) { | |
| 256 if (this->glVersion() >= GR_GL_VER(2,0) || | |
| 257 this->hasExtension("GL_ARB_texture_non_power_of_two")) { | |
| 258 caps->fNPOTTextureTileSupport = true; | |
| 259 } else { | |
| 260 caps->fNPOTTextureTileSupport = false; | |
| 261 } | |
| 262 } else { | |
| 263 // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip
filters only | |
| 264 caps->fNPOTTextureTileSupport = this->hasExtension("GL_OES_texture_npot"
); | |
| 265 } | |
| 266 | |
| 267 caps->fHWAALineSupport = (kDesktop_GrGLBinding == this->glBinding()); | |
| 268 | |
| 269 GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_SIZE, &caps->fMaxTextureSize); | |
| 270 GR_GL_GetIntegerv(gl, GR_GL_MAX_RENDERBUFFER_SIZE, &caps->fMaxRenderTargetSi
ze); | |
| 271 // Our render targets are always created with textures as the color | |
| 272 // attachment, hence this min: | |
| 273 caps->fMaxRenderTargetSize = GrMin(caps->fMaxTextureSize, caps->fMaxRenderTa
rgetSize); | |
| 274 | |
| 275 caps->fFSAASupport = GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType()
; | |
| 276 caps->fPathStencilingSupport = GR_GL_USE_NV_PATH_RENDERING && | |
| 277 this->hasExtension("GL_NV_path_rendering"); | |
| 278 | |
| 279 // Enable supported shader-related caps | |
| 280 if (kDesktop_GrGLBinding == this->glBinding()) { | |
| 281 caps->fDualSourceBlendingSupport = this->glVersion() >= GR_GL_VER(3,3) |
| | |
| 282 this->hasExtension("GL_ARB_blend_func
_extended"); | |
| 283 caps->fShaderDerivativeSupport = true; | |
| 284 // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS | |
| 285 caps->fGeometryShaderSupport = this->glVersion() >= GR_GL_VER(3,2) && | |
| 286 this->glslGeneration() >= k150_GrGLSLGene
ration; | |
| 287 } else { | |
| 288 caps->fShaderDerivativeSupport = this->hasExtension("GL_OES_standard_der
ivatives"); | |
| 289 } | |
| 290 | |
| 291 if (GrGLCaps::kImaginationES_MSFBOType == this->glCaps().msFBOType()) { | |
| 292 GR_GL_GetIntegerv(this->glInterface(), GR_GL_MAX_SAMPLES_IMG, &caps->fMa
xSampleCount); | |
| 293 } else if (GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType()) { | |
| 294 GR_GL_GetIntegerv(this->glInterface(), GR_GL_MAX_SAMPLES, &caps->fMaxSam
pleCount); | |
| 295 } | |
| 296 } | |
| 297 | |
| 298 void GrGpuGL::fillInConfigRenderableTable() { | 212 void GrGpuGL::fillInConfigRenderableTable() { |
| 299 | 213 |
| 300 // OpenGL < 3.0 | 214 // OpenGL < 3.0 |
| 301 // no support for render targets unless the GL_ARB_framebuffer_object | 215 // no support for render targets unless the GL_ARB_framebuffer_object |
| 302 // extension is supported (in which case we get ALPHA, RED, RG, RGB, | 216 // extension is supported (in which case we get ALPHA, RED, RG, RGB, |
| 303 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we | 217 // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we |
| 304 // probably don't get R8 in this case. | 218 // probably don't get R8 in this case. |
| 305 | 219 |
| 306 // OpenGL 3.0 | 220 // OpenGL 3.0 |
| 307 // base color renderable: ALPHA, RED, RG, RGB, and RGBA | 221 // base color renderable: ALPHA, RED, RG, RGB, and RGBA |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 } else { | 306 } else { |
| 393 return true; | 307 return true; |
| 394 } | 308 } |
| 395 } | 309 } |
| 396 | 310 |
| 397 bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { | 311 bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { |
| 398 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); | 312 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); |
| 399 } | 313 } |
| 400 | 314 |
| 401 void GrGpuGL::onResetContext() { | 315 void GrGpuGL::onResetContext() { |
| 402 if (gPrintStartupSpew && !fPrintedCaps) { | |
| 403 fPrintedCaps = true; | |
| 404 this->getCaps().print(); | |
| 405 this->glCaps().print(); | |
| 406 } | |
| 407 | 316 |
| 408 // we don't use the zb at all | 317 // we don't use the zb at all |
| 409 GL_CALL(Disable(GR_GL_DEPTH_TEST)); | 318 GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
| 410 GL_CALL(DepthMask(GR_GL_FALSE)); | 319 GL_CALL(DepthMask(GR_GL_FALSE)); |
| 411 | 320 |
| 412 fHWDrawFace = GrDrawState::kInvalid_DrawFace; | 321 fHWDrawFace = GrDrawState::kInvalid_DrawFace; |
| 413 fHWDitherEnabled = kUnknown_TriState; | 322 fHWDitherEnabled = kUnknown_TriState; |
| 414 | 323 |
| 415 if (kDesktop_GrGLBinding == this->glBinding()) { | 324 if (kDesktop_GrGLBinding == this->glBinding()) { |
| 416 // Desktop-only state that we never change | 325 // Desktop-only state that we never change |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 fHWViewport.invalidate(); | 365 fHWViewport.invalidate(); |
| 457 | 366 |
| 458 fHWStencilSettings.invalidate(); | 367 fHWStencilSettings.invalidate(); |
| 459 fHWStencilTestEnabled = kUnknown_TriState; | 368 fHWStencilTestEnabled = kUnknown_TriState; |
| 460 | 369 |
| 461 fHWGeometryState.invalidate(); | 370 fHWGeometryState.invalidate(); |
| 462 | 371 |
| 463 fHWBoundRenderTarget = NULL; | 372 fHWBoundRenderTarget = NULL; |
| 464 | 373 |
| 465 fHWPathStencilMatrixState.invalidate(); | 374 fHWPathStencilMatrixState.invalidate(); |
| 466 if (fCaps.pathStencilingSupport()) { | 375 if (this->caps()->pathStencilingSupport()) { |
| 467 // we don't use the model view matrix. | 376 // we don't use the model view matrix. |
| 468 GL_CALL(MatrixMode(GR_GL_MODELVIEW)); | 377 GL_CALL(MatrixMode(GR_GL_MODELVIEW)); |
| 469 GL_CALL(LoadIdentity()); | 378 GL_CALL(LoadIdentity()); |
| 470 } | 379 } |
| 471 | 380 |
| 472 // we assume these values | 381 // we assume these values |
| 473 if (this->glCaps().unpackRowLengthSupport()) { | 382 if (this->glCaps().unpackRowLengthSupport()) { |
| 474 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); | 383 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); |
| 475 } | 384 } |
| 476 if (this->glCaps().packRowLengthSupport()) { | 385 if (this->glCaps().packRowLengthSupport()) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 504 | 413 |
| 505 GrTexture* GrGpuGL::onWrapBackendTexture(const GrBackendTextureDesc& desc) { | 414 GrTexture* GrGpuGL::onWrapBackendTexture(const GrBackendTextureDesc& desc) { |
| 506 if (!this->configToGLFormats(desc.fConfig, false, NULL, NULL, NULL)) { | 415 if (!this->configToGLFormats(desc.fConfig, false, NULL, NULL, NULL)) { |
| 507 return NULL; | 416 return NULL; |
| 508 } | 417 } |
| 509 | 418 |
| 510 if (0 == desc.fTextureHandle) { | 419 if (0 == desc.fTextureHandle) { |
| 511 return NULL; | 420 return NULL; |
| 512 } | 421 } |
| 513 | 422 |
| 514 int maxSize = this->getCaps().maxTextureSize(); | 423 int maxSize = this->caps()->maxTextureSize(); |
| 515 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | 424 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
| 516 return NULL; | 425 return NULL; |
| 517 } | 426 } |
| 518 | 427 |
| 519 GrGLTexture::Desc glTexDesc; | 428 GrGLTexture::Desc glTexDesc; |
| 520 // next line relies on GrBackendTextureDesc's flags matching GrTexture's | 429 // next line relies on GrBackendTextureDesc's flags matching GrTexture's |
| 521 glTexDesc.fFlags = (GrTextureFlags) desc.fFlags; | 430 glTexDesc.fFlags = (GrTextureFlags) desc.fFlags; |
| 522 glTexDesc.fWidth = desc.fWidth; | 431 glTexDesc.fWidth = desc.fWidth; |
| 523 glTexDesc.fHeight = desc.fHeight; | 432 glTexDesc.fHeight = desc.fHeight; |
| 524 glTexDesc.fConfig = desc.fConfig; | 433 glTexDesc.fConfig = desc.fConfig; |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 } | 738 } |
| 830 return succeeded; | 739 return succeeded; |
| 831 } | 740 } |
| 832 | 741 |
| 833 namespace { | 742 namespace { |
| 834 bool renderbuffer_storage_msaa(GrGLContext& ctx, | 743 bool renderbuffer_storage_msaa(GrGLContext& ctx, |
| 835 int sampleCount, | 744 int sampleCount, |
| 836 GrGLenum format, | 745 GrGLenum format, |
| 837 int width, int height) { | 746 int width, int height) { |
| 838 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); | 747 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); |
| 839 GrAssert(GrGLCaps::kNone_MSFBOType != ctx.info().caps().msFBOType()); | 748 GrAssert(GrGLCaps::kNone_MSFBOType != ctx.info().caps()->msFBOType()); |
| 840 bool created = false; | 749 bool created = false; |
| 841 if (GrGLCaps::kNVDesktop_CoverageAAType == | 750 if (GrGLCaps::kNVDesktop_CoverageAAType == |
| 842 ctx.info().caps().coverageAAType()) { | 751 ctx.info().caps()->coverageAAType()) { |
| 843 const GrGLCaps::MSAACoverageMode& mode = | 752 const GrGLCaps::MSAACoverageMode& mode = |
| 844 ctx.info().caps().getMSAACoverageMode(sampleCount); | 753 ctx.info().caps()->getMSAACoverageMode(sampleCount); |
| 845 GL_ALLOC_CALL(ctx.interface(), | 754 GL_ALLOC_CALL(ctx.interface(), |
| 846 RenderbufferStorageMultisampleCoverage(GR_GL_RENDERBUFFER, | 755 RenderbufferStorageMultisampleCoverage(GR_GL_RENDERBUFFER, |
| 847 mode.fCoverageSampleCnt, | 756 mode.fCoverageSampleCnt, |
| 848 mode.fColorSampleCnt, | 757 mode.fColorSampleCnt, |
| 849 format, | 758 format, |
| 850 width, height)); | 759 width, height)); |
| 851 created = (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); | 760 created = (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); |
| 852 } | 761 } |
| 853 if (!created) { | 762 if (!created) { |
| 854 GL_ALLOC_CALL(ctx.interface(), | 763 GL_ALLOC_CALL(ctx.interface(), |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID)); | 826 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID)); |
| 918 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 827 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 919 GR_GL_COLOR_ATTACHMENT0, | 828 GR_GL_COLOR_ATTACHMENT0, |
| 920 GR_GL_RENDERBUFFER, | 829 GR_GL_RENDERBUFFER, |
| 921 desc->fMSColorRenderbufferID)); | 830 desc->fMSColorRenderbufferID)); |
| 922 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { | 831 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { |
| 923 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | 832 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
| 924 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 833 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
| 925 goto FAILED; | 834 goto FAILED; |
| 926 } | 835 } |
| 927 fGLContext.info().caps().markConfigAsValidColorAttachment(desc->fCon
fig); | 836 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fCo
nfig); |
| 928 } | 837 } |
| 929 } | 838 } |
| 930 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID)); | 839 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID)); |
| 931 | 840 |
| 932 if (GrGLCaps::kImaginationES_MSFBOType == this->glCaps().msFBOType() && desc
->fSampleCnt > 0) { | 841 if (GrGLCaps::kImaginationES_MSFBOType == this->glCaps().msFBOType() && desc
->fSampleCnt > 0) { |
| 933 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER, | 842 GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER, |
| 934 GR_GL_COLOR_ATTACHMENT0, | 843 GR_GL_COLOR_ATTACHMENT0, |
| 935 GR_GL_TEXTURE_2D, | 844 GR_GL_TEXTURE_2D, |
| 936 texID, 0, desc->fSampleCnt)); | 845 texID, 0, desc->fSampleCnt)); |
| 937 } else { | 846 } else { |
| 938 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, | 847 GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER, |
| 939 GR_GL_COLOR_ATTACHMENT0, | 848 GR_GL_COLOR_ATTACHMENT0, |
| 940 GR_GL_TEXTURE_2D, | 849 GR_GL_TEXTURE_2D, |
| 941 texID, 0)); | 850 texID, 0)); |
| 942 } | 851 } |
| 943 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { | 852 if (!this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) { |
| 944 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | 853 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
| 945 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 854 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
| 946 goto FAILED; | 855 goto FAILED; |
| 947 } | 856 } |
| 948 fGLContext.info().caps().markConfigAsValidColorAttachment(desc->fConfig)
; | 857 fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fConfig
); |
| 949 } | 858 } |
| 950 | 859 |
| 951 return true; | 860 return true; |
| 952 | 861 |
| 953 FAILED: | 862 FAILED: |
| 954 if (desc->fMSColorRenderbufferID) { | 863 if (desc->fMSColorRenderbufferID) { |
| 955 GL_CALL(DeleteRenderbuffers(1, &desc->fMSColorRenderbufferID)); | 864 GL_CALL(DeleteRenderbuffers(1, &desc->fMSColorRenderbufferID)); |
| 956 } | 865 } |
| 957 if (desc->fRTFBOID != desc->fTexFBOID) { | 866 if (desc->fRTFBOID != desc->fTexFBOID) { |
| 958 GL_CALL(DeleteFramebuffers(1, &desc->fRTFBOID)); | 867 GL_CALL(DeleteFramebuffers(1, &desc->fRTFBOID)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 983 GrGLRenderTarget::Desc glRTDesc; | 892 GrGLRenderTarget::Desc glRTDesc; |
| 984 | 893 |
| 985 // Attempt to catch un- or wrongly initialized sample counts; | 894 // Attempt to catch un- or wrongly initialized sample counts; |
| 986 GrAssert(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); | 895 GrAssert(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); |
| 987 // We fail if the MSAA was requested and is not available. | 896 // We fail if the MSAA was requested and is not available. |
| 988 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { | 897 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { |
| 989 //GrPrintf("MSAA RT requested but not supported on this platform."); | 898 //GrPrintf("MSAA RT requested but not supported on this platform."); |
| 990 return return_null_texture(); | 899 return return_null_texture(); |
| 991 } | 900 } |
| 992 // If the sample count exceeds the max then we clamp it. | 901 // If the sample count exceeds the max then we clamp it. |
| 993 glTexDesc.fSampleCnt = GrMin(desc.fSampleCnt, this->getCaps().maxSampleCount
()); | 902 glTexDesc.fSampleCnt = GrMin(desc.fSampleCnt, this->caps()->maxSampleCount()
); |
| 994 | 903 |
| 995 glTexDesc.fFlags = desc.fFlags; | 904 glTexDesc.fFlags = desc.fFlags; |
| 996 glTexDesc.fWidth = desc.fWidth; | 905 glTexDesc.fWidth = desc.fWidth; |
| 997 glTexDesc.fHeight = desc.fHeight; | 906 glTexDesc.fHeight = desc.fHeight; |
| 998 glTexDesc.fConfig = desc.fConfig; | 907 glTexDesc.fConfig = desc.fConfig; |
| 999 glTexDesc.fIsWrapped = false; | 908 glTexDesc.fIsWrapped = false; |
| 1000 | 909 |
| 1001 glRTDesc.fMSColorRenderbufferID = 0; | 910 glRTDesc.fMSColorRenderbufferID = 0; |
| 1002 glRTDesc.fRTFBOID = 0; | 911 glRTDesc.fRTFBOID = 0; |
| 1003 glRTDesc.fTexFBOID = 0; | 912 glRTDesc.fTexFBOID = 0; |
| 1004 glRTDesc.fIsWrapped = false; | 913 glRTDesc.fIsWrapped = false; |
| 1005 glRTDesc.fConfig = glTexDesc.fConfig; | 914 glRTDesc.fConfig = glTexDesc.fConfig; |
| 1006 | 915 |
| 1007 bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit); | 916 bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit); |
| 1008 | 917 |
| 1009 const Caps& caps = this->getCaps(); | |
| 1010 | |
| 1011 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); | 918 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); |
| 1012 glRTDesc.fOrigin = glTexDesc.fOrigin; | 919 glRTDesc.fOrigin = glTexDesc.fOrigin; |
| 1013 | 920 |
| 1014 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt; | 921 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt; |
| 1015 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && | 922 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && |
| 1016 desc.fSampleCnt) { | 923 desc.fSampleCnt) { |
| 1017 //GrPrintf("MSAA RT requested but not supported on this platform."); | 924 //GrPrintf("MSAA RT requested but not supported on this platform."); |
| 1018 return return_null_texture(); | 925 return return_null_texture(); |
| 1019 } | 926 } |
| 1020 | 927 |
| 1021 if (renderTarget) { | 928 if (renderTarget) { |
| 1022 if (glTexDesc.fWidth > caps.maxRenderTargetSize() || | 929 int maxRTSize = this->caps()->maxRenderTargetSize(); |
| 1023 glTexDesc.fHeight > caps.maxRenderTargetSize()) { | 930 if (glTexDesc.fWidth > maxRTSize || glTexDesc.fHeight > maxRTSize) { |
| 1024 return return_null_texture(); | 931 return return_null_texture(); |
| 1025 } | 932 } |
| 1026 } | 933 } |
| 1027 | 934 |
| 1028 GL_CALL(GenTextures(1, &glTexDesc.fTextureID)); | 935 GL_CALL(GenTextures(1, &glTexDesc.fTextureID)); |
| 1029 if (renderTarget && this->glCaps().textureUsageSupport()) { | 936 if (renderTarget && this->glCaps().textureUsageSupport()) { |
| 1030 // provides a hint about how this texture will be used | 937 // provides a hint about how this texture will be used |
| 1031 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, | 938 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, |
| 1032 GR_GL_TEXTURE_USAGE, | 939 GR_GL_TEXTURE_USAGE, |
| 1033 GR_GL_FRAMEBUFFER_ATTACHMENT)); | 940 GR_GL_FRAMEBUFFER_ATTACHMENT)); |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1227 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1134 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1228 GR_GL_STENCIL_ATTACHMENT, | 1135 GR_GL_STENCIL_ATTACHMENT, |
| 1229 GR_GL_RENDERBUFFER, 0)); | 1136 GR_GL_RENDERBUFFER, 0)); |
| 1230 if (glsb->format().fPacked) { | 1137 if (glsb->format().fPacked) { |
| 1231 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1138 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
| 1232 GR_GL_DEPTH_ATTACHMENT, | 1139 GR_GL_DEPTH_ATTACHMENT, |
| 1233 GR_GL_RENDERBUFFER, 0)); | 1140 GR_GL_RENDERBUFFER, 0)); |
| 1234 } | 1141 } |
| 1235 return false; | 1142 return false; |
| 1236 } else { | 1143 } else { |
| 1237 fGLContext.info().caps().markColorConfigAndStencilFormatAsVerifi
ed( | 1144 fGLContext.info().caps()->markColorConfigAndStencilFormatAsVerif
ied( |
| 1238 rt->config(), | 1145 rt->config(), |
| 1239 glsb->format()); | 1146 glsb->format()); |
| 1240 } | 1147 } |
| 1241 } | 1148 } |
| 1242 return true; | 1149 return true; |
| 1243 } | 1150 } |
| 1244 } | 1151 } |
| 1245 | 1152 |
| 1246 //////////////////////////////////////////////////////////////////////////////// | 1153 //////////////////////////////////////////////////////////////////////////////// |
| 1247 | 1154 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1305 return NULL; | 1212 return NULL; |
| 1306 } | 1213 } |
| 1307 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); | 1214 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); |
| 1308 return indexBuffer; | 1215 return indexBuffer; |
| 1309 } | 1216 } |
| 1310 return NULL; | 1217 return NULL; |
| 1311 } | 1218 } |
| 1312 } | 1219 } |
| 1313 | 1220 |
| 1314 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { | 1221 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { |
| 1315 GrAssert(fCaps.pathStencilingSupport()); | 1222 GrAssert(this->caps()->pathStencilingSupport()); |
| 1316 return SkNEW_ARGS(GrGLPath, (this, inPath)); | 1223 return SkNEW_ARGS(GrGLPath, (this, inPath)); |
| 1317 } | 1224 } |
| 1318 | 1225 |
| 1319 void GrGpuGL::flushScissor() { | 1226 void GrGpuGL::flushScissor() { |
| 1320 const GrDrawState& drawState = this->getDrawState(); | 1227 const GrDrawState& drawState = this->getDrawState(); |
| 1321 const GrGLRenderTarget* rt = | 1228 const GrGLRenderTarget* rt = |
| 1322 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); | 1229 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); |
| 1323 | 1230 |
| 1324 GrAssert(NULL != rt); | 1231 GrAssert(NULL != rt); |
| 1325 const GrGLIRect& vp = rt->getViewport(); | 1232 const GrGLIRect& vp = rt->getViewport(); |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1728 return; | 1635 return; |
| 1729 case SkPath::kWinding_FillType: | 1636 case SkPath::kWinding_FillType: |
| 1730 *settings = winding_nv_path_stencil_settings(); | 1637 *settings = winding_nv_path_stencil_settings(); |
| 1731 return; | 1638 return; |
| 1732 default: | 1639 default: |
| 1733 GrCrash("Unexpected path fill."); | 1640 GrCrash("Unexpected path fill."); |
| 1734 } | 1641 } |
| 1735 } | 1642 } |
| 1736 | 1643 |
| 1737 void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { | 1644 void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { |
| 1738 GrAssert(fCaps.pathStencilingSupport()); | 1645 GrAssert(this->caps()->pathStencilingSupport()); |
| 1739 | 1646 |
| 1740 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); | 1647 GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
| 1741 GrDrawState* drawState = this->drawState(); | 1648 GrDrawState* drawState = this->drawState(); |
| 1742 GrAssert(NULL != drawState->getRenderTarget()); | 1649 GrAssert(NULL != drawState->getRenderTarget()); |
| 1743 if (NULL == drawState->getRenderTarget()->getStencilBuffer()) { | 1650 if (NULL == drawState->getRenderTarget()->getStencilBuffer()) { |
| 1744 return; | 1651 return; |
| 1745 } | 1652 } |
| 1746 | 1653 |
| 1747 // Decide how to manipulate the stencil buffer based on the fill rule. | 1654 // Decide how to manipulate the stencil buffer based on the fill rule. |
| 1748 // Also, assert that the stencil settings we set in setStencilPathSettings | 1655 // Also, assert that the stencil settings we set in setStencilPathSettings |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1911 GL_CALL(Disable(GR_GL_STENCIL_TEST)); | 1818 GL_CALL(Disable(GR_GL_STENCIL_TEST)); |
| 1912 fHWStencilTestEnabled = kNo_TriState; | 1819 fHWStencilTestEnabled = kNo_TriState; |
| 1913 } | 1820 } |
| 1914 } else { | 1821 } else { |
| 1915 if (kYes_TriState != fHWStencilTestEnabled) { | 1822 if (kYes_TriState != fHWStencilTestEnabled) { |
| 1916 GL_CALL(Enable(GR_GL_STENCIL_TEST)); | 1823 GL_CALL(Enable(GR_GL_STENCIL_TEST)); |
| 1917 fHWStencilTestEnabled = kYes_TriState; | 1824 fHWStencilTestEnabled = kYes_TriState; |
| 1918 } | 1825 } |
| 1919 } | 1826 } |
| 1920 if (!fStencilSettings.isDisabled()) { | 1827 if (!fStencilSettings.isDisabled()) { |
| 1921 if (this->getCaps().twoSidedStencilSupport()) { | 1828 if (this->caps()->twoSidedStencilSupport()) { |
| 1922 set_gl_stencil(this->glInterface(), | 1829 set_gl_stencil(this->glInterface(), |
| 1923 fStencilSettings, | 1830 fStencilSettings, |
| 1924 GR_GL_FRONT, | 1831 GR_GL_FRONT, |
| 1925 GrStencilSettings::kFront_Face); | 1832 GrStencilSettings::kFront_Face); |
| 1926 set_gl_stencil(this->glInterface(), | 1833 set_gl_stencil(this->glInterface(), |
| 1927 fStencilSettings, | 1834 fStencilSettings, |
| 1928 GR_GL_BACK, | 1835 GR_GL_BACK, |
| 1929 GrStencilSettings::kBack_Face); | 1836 GrStencilSettings::kBack_Face); |
| 1930 } else { | 1837 } else { |
| 1931 set_gl_stencil(this->glInterface(), | 1838 set_gl_stencil(this->glInterface(), |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2261 *internalFormat = GR_GL_RGBA; | 2168 *internalFormat = GR_GL_RGBA; |
| 2262 *externalFormat = GR_GL_RGBA; | 2169 *externalFormat = GR_GL_RGBA; |
| 2263 if (getSizedInternalFormat) { | 2170 if (getSizedInternalFormat) { |
| 2264 *internalFormat = GR_GL_RGBA4; | 2171 *internalFormat = GR_GL_RGBA4; |
| 2265 } else { | 2172 } else { |
| 2266 *internalFormat = GR_GL_RGBA; | 2173 *internalFormat = GR_GL_RGBA; |
| 2267 } | 2174 } |
| 2268 *externalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; | 2175 *externalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; |
| 2269 break; | 2176 break; |
| 2270 case kIndex_8_GrPixelConfig: | 2177 case kIndex_8_GrPixelConfig: |
| 2271 if (this->getCaps().eightBitPaletteSupport()) { | 2178 if (this->caps()->eightBitPaletteSupport()) { |
| 2272 *internalFormat = GR_GL_PALETTE8_RGBA8; | 2179 *internalFormat = GR_GL_PALETTE8_RGBA8; |
| 2273 // glCompressedTexImage doesn't take external params | 2180 // glCompressedTexImage doesn't take external params |
| 2274 *externalFormat = GR_GL_PALETTE8_RGBA8; | 2181 *externalFormat = GR_GL_PALETTE8_RGBA8; |
| 2275 // no sized/unsized internal format distinction here | 2182 // no sized/unsized internal format distinction here |
| 2276 *internalFormat = GR_GL_PALETTE8_RGBA8; | 2183 *internalFormat = GR_GL_PALETTE8_RGBA8; |
| 2277 // unused with CompressedTexImage | 2184 // unused with CompressedTexImage |
| 2278 *externalType = GR_GL_UNSIGNED_BYTE; | 2185 *externalType = GR_GL_UNSIGNED_BYTE; |
| 2279 } else { | 2186 } else { |
| 2280 return false; | 2187 return false; |
| 2281 } | 2188 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 this->setVertexArrayID(gpu, 0); | 2254 this->setVertexArrayID(gpu, 0); |
| 2348 } | 2255 } |
| 2349 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2256 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2350 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2257 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2351 fDefaultVertexArrayAttribState.resize(attrCount); | 2258 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2352 } | 2259 } |
| 2353 attribState = &fDefaultVertexArrayAttribState; | 2260 attribState = &fDefaultVertexArrayAttribState; |
| 2354 } | 2261 } |
| 2355 return attribState; | 2262 return attribState; |
| 2356 } | 2263 } |
| OLD | NEW |