| 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 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 return NULL; | 369 return NULL; |
| 370 } | 370 } |
| 371 | 371 |
| 372 int maxSize = this->caps()->maxTextureSize(); | 372 int maxSize = this->caps()->maxTextureSize(); |
| 373 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | 373 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
| 374 return NULL; | 374 return NULL; |
| 375 } | 375 } |
| 376 | 376 |
| 377 GrGLTexture::Desc glTexDesc; | 377 GrGLTexture::Desc glTexDesc; |
| 378 // next line relies on GrBackendTextureDesc's flags matching GrTexture's | 378 // next line relies on GrBackendTextureDesc's flags matching GrTexture's |
| 379 glTexDesc.fFlags = (GrTextureFlags) desc.fFlags; | 379 glTexDesc.fFlags = (GrSurfaceFlags) desc.fFlags; |
| 380 glTexDesc.fWidth = desc.fWidth; | 380 glTexDesc.fWidth = desc.fWidth; |
| 381 glTexDesc.fHeight = desc.fHeight; | 381 glTexDesc.fHeight = desc.fHeight; |
| 382 glTexDesc.fConfig = desc.fConfig; | 382 glTexDesc.fConfig = desc.fConfig; |
| 383 glTexDesc.fSampleCnt = desc.fSampleCnt; | 383 glTexDesc.fSampleCnt = desc.fSampleCnt; |
| 384 glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle); | 384 glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle); |
| 385 glTexDesc.fIsWrapped = true; | 385 glTexDesc.fIsWrapped = true; |
| 386 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFla
g); | 386 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFla
g); |
| 387 // FIXME: this should be calling resolve_origin(), but Chrome code is curre
ntly | 387 // FIXME: this should be calling resolve_origin(), but Chrome code is curre
ntly |
| 388 // assuming the old behaviour, which is that backend textures are always | 388 // assuming the old behaviour, which is that backend textures are always |
| 389 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to: | 389 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to: |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 *data = reinterpret_cast<const void*>(reinterpret_cast<intptr_t>(*data) + | 523 *data = reinterpret_cast<const void*>(reinterpret_cast<intptr_t>(*data) + |
| 524 (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp); | 524 (subRect.fTop - *top) * *rowBytes + (subRect.fLeft - *left) * bpp); |
| 525 | 525 |
| 526 *left = subRect.fLeft; | 526 *left = subRect.fLeft; |
| 527 *top = subRect.fTop; | 527 *top = subRect.fTop; |
| 528 *width = subRect.width(); | 528 *width = subRect.width(); |
| 529 *height = subRect.height(); | 529 *height = subRect.height(); |
| 530 return true; | 530 return true; |
| 531 } | 531 } |
| 532 | 532 |
| 533 GrGLenum check_alloc_error(const GrTextureDesc& desc, const GrGLInterface* inter
face) { | 533 GrGLenum check_alloc_error(const GrSurfaceDesc& desc, const GrGLInterface* inter
face) { |
| 534 if (SkToBool(desc.fFlags & kCheckAllocation_GrTextureFlagBit)) { | 534 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { |
| 535 return GR_GL_GET_ERROR(interface); | 535 return GR_GL_GET_ERROR(interface); |
| 536 } else { | 536 } else { |
| 537 return CHECK_ALLOC_ERROR(interface); | 537 return CHECK_ALLOC_ERROR(interface); |
| 538 } | 538 } |
| 539 } | 539 } |
| 540 | 540 |
| 541 } | 541 } |
| 542 | 542 |
| 543 bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, | 543 bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc, |
| 544 bool isNewTexture, | 544 bool isNewTexture, |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 // SkDEBUGFAIL("null texture"); | 934 // SkDEBUGFAIL("null texture"); |
| 935 return NULL; | 935 return NULL; |
| 936 } | 936 } |
| 937 | 937 |
| 938 #if 0 && defined(SK_DEBUG) | 938 #if 0 && defined(SK_DEBUG) |
| 939 static size_t as_size_t(int x) { | 939 static size_t as_size_t(int x) { |
| 940 return x; | 940 return x; |
| 941 } | 941 } |
| 942 #endif | 942 #endif |
| 943 | 943 |
| 944 GrTexture* GrGpuGL::onCreateTexture(const GrTextureDesc& desc, | 944 GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc, |
| 945 const void* srcData, | 945 const void* srcData, |
| 946 size_t rowBytes) { | 946 size_t rowBytes) { |
| 947 | 947 |
| 948 GrGLTexture::Desc glTexDesc; | 948 GrGLTexture::Desc glTexDesc; |
| 949 GrGLRenderTarget::Desc glRTDesc; | 949 GrGLRenderTarget::Desc glRTDesc; |
| 950 | 950 |
| 951 // Attempt to catch un- or wrongly initialized sample counts; | 951 // Attempt to catch un- or wrongly initialized sample counts; |
| 952 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); | 952 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); |
| 953 // We fail if the MSAA was requested and is not available. | 953 // We fail if the MSAA was requested and is not available. |
| 954 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { | 954 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { |
| 955 //GrPrintf("MSAA RT requested but not supported on this platform."); | 955 //GrPrintf("MSAA RT requested but not supported on this platform."); |
| 956 return return_null_texture(); | 956 return return_null_texture(); |
| 957 } | 957 } |
| 958 // If the sample count exceeds the max then we clamp it. | 958 // If the sample count exceeds the max then we clamp it. |
| 959 glTexDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount(
)); | 959 glTexDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount(
)); |
| 960 | 960 |
| 961 glTexDesc.fFlags = desc.fFlags; | 961 glTexDesc.fFlags = desc.fFlags; |
| 962 glTexDesc.fWidth = desc.fWidth; | 962 glTexDesc.fWidth = desc.fWidth; |
| 963 glTexDesc.fHeight = desc.fHeight; | 963 glTexDesc.fHeight = desc.fHeight; |
| 964 glTexDesc.fConfig = desc.fConfig; | 964 glTexDesc.fConfig = desc.fConfig; |
| 965 glTexDesc.fIsWrapped = false; | 965 glTexDesc.fIsWrapped = false; |
| 966 | 966 |
| 967 glRTDesc.fMSColorRenderbufferID = 0; | 967 glRTDesc.fMSColorRenderbufferID = 0; |
| 968 glRTDesc.fRTFBOID = 0; | 968 glRTDesc.fRTFBOID = 0; |
| 969 glRTDesc.fTexFBOID = 0; | 969 glRTDesc.fTexFBOID = 0; |
| 970 glRTDesc.fIsWrapped = false; | 970 glRTDesc.fIsWrapped = false; |
| 971 glRTDesc.fConfig = glTexDesc.fConfig; | 971 glRTDesc.fConfig = glTexDesc.fConfig; |
| 972 glRTDesc.fCheckAllocation = SkToBool(desc.fFlags & kCheckAllocation_GrTextur
eFlagBit); | 972 glRTDesc.fCheckAllocation = SkToBool(desc.fFlags & kCheckAllocation_GrSurfac
eFlag); |
| 973 | 973 |
| 974 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrTextureFlagBit); | 974 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); |
| 975 | 975 |
| 976 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); | 976 glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); |
| 977 glRTDesc.fOrigin = glTexDesc.fOrigin; | 977 glRTDesc.fOrigin = glTexDesc.fOrigin; |
| 978 | 978 |
| 979 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt; | 979 glRTDesc.fSampleCnt = glTexDesc.fSampleCnt; |
| 980 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && | 980 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && |
| 981 desc.fSampleCnt) { | 981 desc.fSampleCnt) { |
| 982 //GrPrintf("MSAA RT requested but not supported on this platform."); | 982 //GrPrintf("MSAA RT requested but not supported on this platform."); |
| 983 return return_null_texture(); | 983 return return_null_texture(); |
| 984 } | 984 } |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1057 tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc)); | 1057 tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc)); |
| 1058 } | 1058 } |
| 1059 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); | 1059 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); |
| 1060 #ifdef TRACE_TEXTURE_CREATION | 1060 #ifdef TRACE_TEXTURE_CREATION |
| 1061 GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n", | 1061 GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n", |
| 1062 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); | 1062 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); |
| 1063 #endif | 1063 #endif |
| 1064 return tex; | 1064 return tex; |
| 1065 } | 1065 } |
| 1066 | 1066 |
| 1067 GrTexture* GrGpuGL::onCreateCompressedTexture(const GrTextureDesc& desc, | 1067 GrTexture* GrGpuGL::onCreateCompressedTexture(const GrSurfaceDesc& desc, |
| 1068 const void* srcData) { | 1068 const void* srcData) { |
| 1069 | 1069 |
| 1070 if(SkToBool(desc.fFlags & kRenderTarget_GrTextureFlagBit)) { | 1070 if(SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) { |
| 1071 return return_null_texture(); | 1071 return return_null_texture(); |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 // Make sure that we're not flipping Y. | 1074 // Make sure that we're not flipping Y. |
| 1075 GrSurfaceOrigin texOrigin = resolve_origin(desc.fOrigin, false); | 1075 GrSurfaceOrigin texOrigin = resolve_origin(desc.fOrigin, false); |
| 1076 if (kBottomLeft_GrSurfaceOrigin == texOrigin) { | 1076 if (kBottomLeft_GrSurfaceOrigin == texOrigin) { |
| 1077 return return_null_texture(); | 1077 return return_null_texture(); |
| 1078 } | 1078 } |
| 1079 | 1079 |
| 1080 GrGLTexture::Desc glTexDesc; | 1080 GrGLTexture::Desc glTexDesc; |
| (...skipping 1323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2404 viewport->fHeight = surface->height(); | 2404 viewport->fHeight = surface->height(); |
| 2405 } else { | 2405 } else { |
| 2406 tempFBOID = 0; | 2406 tempFBOID = 0; |
| 2407 fGPUStats.incRenderTargetBinds(); | 2407 fGPUStats.incRenderTargetBinds(); |
| 2408 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); | 2408 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); |
| 2409 *viewport = rt->getViewport(); | 2409 *viewport = rt->getViewport(); |
| 2410 } | 2410 } |
| 2411 return tempFBOID; | 2411 return tempFBOID; |
| 2412 } | 2412 } |
| 2413 | 2413 |
| 2414 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc)
{ | 2414 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc)
{ |
| 2415 // Check for format issues with glCopyTexSubImage2D | 2415 // Check for format issues with glCopyTexSubImage2D |
| 2416 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && | 2416 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && |
| 2417 kBGRA_8888_GrPixelConfig == src->config()) { | 2417 kBGRA_8888_GrPixelConfig == src->config()) { |
| 2418 // glCopyTexSubImage2D doesn't work with this config. We'll want to make
it a render target | 2418 // glCopyTexSubImage2D doesn't work with this config. We'll want to make
it a render target |
| 2419 // in order to call glBlitFramebuffer or to copy to it by rendering. | 2419 // in order to call glBlitFramebuffer or to copy to it by rendering. |
| 2420 INHERITED::initCopySurfaceDstDesc(src, desc); | 2420 INHERITED::initCopySurfaceDstDesc(src, desc); |
| 2421 return; | 2421 return; |
| 2422 } else if (NULL == src->asRenderTarget()) { | 2422 } else if (NULL == src->asRenderTarget()) { |
| 2423 // We don't want to have to create an FBO just to use glCopyTexSubImage2
D. Let the base | 2423 // We don't want to have to create an FBO just to use glCopyTexSubImage2
D. Let the base |
| 2424 // class handle it by rendering. | 2424 // class handle it by rendering. |
| 2425 INHERITED::initCopySurfaceDstDesc(src, desc); | 2425 INHERITED::initCopySurfaceDstDesc(src, desc); |
| 2426 return; | 2426 return; |
| 2427 } | 2427 } |
| 2428 | 2428 |
| 2429 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); | 2429 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); |
| 2430 if (srcRT && srcRT->renderFBOID() != srcRT->textureFBOID()) { | 2430 if (srcRT && srcRT->renderFBOID() != srcRT->textureFBOID()) { |
| 2431 // It's illegal to call CopyTexSubImage2D on a MSAA renderbuffer. | 2431 // It's illegal to call CopyTexSubImage2D on a MSAA renderbuffer. |
| 2432 INHERITED::initCopySurfaceDstDesc(src, desc); | 2432 INHERITED::initCopySurfaceDstDesc(src, desc); |
| 2433 } else { | 2433 } else { |
| 2434 desc->fConfig = src->config(); | 2434 desc->fConfig = src->config(); |
| 2435 desc->fOrigin = src->origin(); | 2435 desc->fOrigin = src->origin(); |
| 2436 desc->fFlags = kNone_GrTextureFlags; | 2436 desc->fFlags = kNone_GrSurfaceFlags; |
| 2437 } | 2437 } |
| 2438 } | 2438 } |
| 2439 | 2439 |
| 2440 bool GrGpuGL::onCopySurface(GrSurface* dst, | 2440 bool GrGpuGL::onCopySurface(GrSurface* dst, |
| 2441 GrSurface* src, | 2441 GrSurface* src, |
| 2442 const SkIRect& srcRect, | 2442 const SkIRect& srcRect, |
| 2443 const SkIPoint& dstPoint) { | 2443 const SkIPoint& dstPoint) { |
| 2444 bool inheritedCouldCopy = INHERITED::onCanCopySurface(dst, src, srcRect, dst
Point); | 2444 bool inheritedCouldCopy = INHERITED::onCanCopySurface(dst, src, srcRect, dst
Point); |
| 2445 bool copied = false; | 2445 bool copied = false; |
| 2446 bool wouldNeedTempFBO = false; | 2446 bool wouldNeedTempFBO = false; |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2609 this->setVertexArrayID(gpu, 0); | 2609 this->setVertexArrayID(gpu, 0); |
| 2610 } | 2610 } |
| 2611 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2611 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2612 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2612 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2613 fDefaultVertexArrayAttribState.resize(attrCount); | 2613 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2614 } | 2614 } |
| 2615 attribState = &fDefaultVertexArrayAttribState; | 2615 attribState = &fDefaultVertexArrayAttribState; |
| 2616 } | 2616 } |
| 2617 return attribState; | 2617 return attribState; |
| 2618 } | 2618 } |
| OLD | NEW |