| 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 "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
| 10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 SkDebugf("\n"); | 143 SkDebugf("\n"); |
| 144 SkDebugf(this->glCaps().dump().c_str()); | 144 SkDebugf(this->glCaps().dump().c_str()); |
| 145 } | 145 } |
| 146 | 146 |
| 147 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); | 147 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); |
| 148 | 148 |
| 149 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); | 149 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); |
| 150 | 150 |
| 151 fLastSuccessfulStencilFmtIdx = 0; | 151 fLastSuccessfulStencilFmtIdx = 0; |
| 152 fHWProgramID = 0; | 152 fHWProgramID = 0; |
| 153 fTempSrcFBOID = 0; |
| 154 fTempDstFBOID = 0; |
| 153 | 155 |
| 154 if (this->glCaps().pathRenderingSupport()) { | 156 if (this->glCaps().pathRenderingSupport()) { |
| 155 fPathRendering.reset(new GrGLPathRendering(this)); | 157 fPathRendering.reset(new GrGLPathRendering(this)); |
| 156 } | 158 } |
| 157 } | 159 } |
| 158 | 160 |
| 159 GrGLGpu::~GrGLGpu() { | 161 GrGLGpu::~GrGLGpu() { |
| 160 if (0 != fHWProgramID) { | 162 if (0 != fHWProgramID) { |
| 161 // detach the current program so there is no confusion on OpenGL's part | 163 // detach the current program so there is no confusion on OpenGL's part |
| 162 // that we want it to be deleted | 164 // that we want it to be deleted |
| 163 SkASSERT(fHWProgramID == fCurrentProgram->programID()); | 165 SkASSERT(fHWProgramID == fCurrentProgram->programID()); |
| 164 GL_CALL(UseProgram(0)); | 166 GL_CALL(UseProgram(0)); |
| 165 } | 167 } |
| 166 | 168 |
| 169 if (0 != fTempSrcFBOID) { |
| 170 GL_CALL(DeleteFramebuffers(1, &fTempSrcFBOID)); |
| 171 } |
| 172 if (0 != fTempDstFBOID) { |
| 173 GL_CALL(DeleteFramebuffers(1, &fTempDstFBOID)); |
| 174 } |
| 175 |
| 167 delete fProgramCache; | 176 delete fProgramCache; |
| 168 } | 177 } |
| 169 | 178 |
| 170 void GrGLGpu::contextAbandoned() { | 179 void GrGLGpu::contextAbandoned() { |
| 171 INHERITED::contextAbandoned(); | 180 INHERITED::contextAbandoned(); |
| 172 fProgramCache->abandon(); | 181 fProgramCache->abandon(); |
| 173 fHWProgramID = 0; | 182 fHWProgramID = 0; |
| 183 fTempSrcFBOID = 0; |
| 184 fTempDstFBOID = 0; |
| 174 if (this->glCaps().pathRenderingSupport()) { | 185 if (this->glCaps().pathRenderingSupport()) { |
| 175 this->glPathRendering()->abandonGpuResources(); | 186 this->glPathRendering()->abandonGpuResources(); |
| 176 } | 187 } |
| 177 } | 188 } |
| 178 | 189 |
| 179 /////////////////////////////////////////////////////////////////////////////// | 190 /////////////////////////////////////////////////////////////////////////////// |
| 180 GrPixelConfig GrGLGpu::preferredReadPixelsConfig(GrPixelConfig readConfig, | 191 GrPixelConfig GrGLGpu::preferredReadPixelsConfig(GrPixelConfig readConfig, |
| 181 GrPixelConfig surfaceConfig) co
nst { | 192 GrPixelConfig surfaceConfig) co
nst { |
| 182 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == readConfig
) { | 193 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == readConfig
) { |
| 183 return kBGRA_8888_GrPixelConfig; | 194 return kBGRA_8888_GrPixelConfig; |
| (...skipping 2261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2445 } | 2456 } |
| 2446 // clear out the this field so that if a program does use this unit it will
rebind the correct | 2457 // clear out the this field so that if a program does use this unit it will
rebind the correct |
| 2447 // texture. | 2458 // texture. |
| 2448 fHWBoundTextureUniqueIDs[lastUnitIdx] = SK_InvalidUniqueID; | 2459 fHWBoundTextureUniqueIDs[lastUnitIdx] = SK_InvalidUniqueID; |
| 2449 } | 2460 } |
| 2450 | 2461 |
| 2451 namespace { | 2462 namespace { |
| 2452 // Determines whether glBlitFramebuffer could be used between src and dst. | 2463 // Determines whether glBlitFramebuffer could be used between src and dst. |
| 2453 inline bool can_blit_framebuffer(const GrSurface* dst, | 2464 inline bool can_blit_framebuffer(const GrSurface* dst, |
| 2454 const GrSurface* src, | 2465 const GrSurface* src, |
| 2455 const GrGLGpu* gpu, | 2466 const GrGLGpu* gpu) { |
| 2456 bool* wouldNeedTempFBO = NULL) { | |
| 2457 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt >
0) && | 2467 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt >
0) && |
| 2458 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && | 2468 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && |
| 2459 gpu->glCaps().usesMSAARenderBuffers()) { | 2469 gpu->glCaps().usesMSAARenderBuffers()) { |
| 2460 // ES3 doesn't allow framebuffer blits when the src has MSAA and the con
figs don't match | 2470 // ES3 doesn't allow framebuffer blits when the src has MSAA and the con
figs don't match |
| 2461 // or the rects are not the same (not just the same size but have the sa
me edges). | 2471 // or the rects are not the same (not just the same size but have the sa
me edges). |
| 2462 if (GrGLCaps::kES_3_0_MSFBOType == gpu->glCaps().msFBOType() && | 2472 if (GrGLCaps::kES_3_0_MSFBOType == gpu->glCaps().msFBOType() && |
| 2463 (src->desc().fSampleCnt > 0 || src->config() != dst->config())) { | 2473 (src->desc().fSampleCnt > 0 || src->config() != dst->config())) { |
| 2464 return false; | 2474 return false; |
| 2465 } | 2475 } |
| 2466 if (wouldNeedTempFBO) { | |
| 2467 *wouldNeedTempFBO = NULL == dst->asRenderTarget() || NULL == src->as
RenderTarget(); | |
| 2468 } | |
| 2469 return true; | 2476 return true; |
| 2470 } else { | 2477 } else { |
| 2471 return false; | 2478 return false; |
| 2472 } | 2479 } |
| 2473 } | 2480 } |
| 2474 | 2481 |
| 2475 inline bool can_copy_texsubimage(const GrSurface* dst, | 2482 inline bool can_copy_texsubimage(const GrSurface* dst, |
| 2476 const GrSurface* src, | 2483 const GrSurface* src, |
| 2477 const GrGLGpu* gpu, | 2484 const GrGLGpu* gpu) { |
| 2478 bool* wouldNeedTempFBO = NULL) { | |
| 2479 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image | 2485 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image |
| 2480 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps | 2486 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps |
| 2481 // many drivers would allow it to work, but ANGLE does not. | 2487 // many drivers would allow it to work, but ANGLE does not. |
| 2482 if (kGLES_GrGLStandard == gpu->glStandard() && gpu->glCaps().bgraIsInternalF
ormat() && | 2488 if (kGLES_GrGLStandard == gpu->glStandard() && gpu->glCaps().bgraIsInternalF
ormat() && |
| 2483 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { | 2489 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { |
| 2484 return false; | 2490 return false; |
| 2485 } | 2491 } |
| 2486 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); | 2492 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); |
| 2487 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) | 2493 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) |
| 2488 // then we don't want to copy to the texture but to the MSAA buffer. | 2494 // then we don't want to copy to the texture but to the MSAA buffer. |
| 2489 if (dstRT && dstRT->renderFBOID() != dstRT->textureFBOID()) { | 2495 if (dstRT && dstRT->renderFBOID() != dstRT->textureFBOID()) { |
| 2490 return false; | 2496 return false; |
| 2491 } | 2497 } |
| 2492 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); | 2498 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); |
| 2493 // If the src is multisampled (and uses an extension where there is a separa
te MSAA | 2499 // If the src is multisampled (and uses an extension where there is a separa
te MSAA |
| 2494 // renderbuffer) then it is an invalid operation to call CopyTexSubImage | 2500 // renderbuffer) then it is an invalid operation to call CopyTexSubImage |
| 2495 if (srcRT && srcRT->renderFBOID() != srcRT->textureFBOID()) { | 2501 if (srcRT && srcRT->renderFBOID() != srcRT->textureFBOID()) { |
| 2496 return false; | 2502 return false; |
| 2497 } | 2503 } |
| 2498 if (gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && | 2504 if (gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && |
| 2499 dst->asTexture() && | 2505 dst->asTexture() && |
| 2500 dst->origin() == src->origin() && | 2506 dst->origin() == src->origin() && |
| 2501 !GrPixelConfigIsCompressed(src->config())) { | 2507 !GrPixelConfigIsCompressed(src->config())) { |
| 2502 if (wouldNeedTempFBO) { | |
| 2503 *wouldNeedTempFBO = NULL == src->asRenderTarget(); | |
| 2504 } | |
| 2505 return true; | 2508 return true; |
| 2506 } else { | 2509 } else { |
| 2507 return false; | 2510 return false; |
| 2508 } | 2511 } |
| 2509 } | 2512 } |
| 2510 | 2513 |
| 2511 } | 2514 } |
| 2512 | 2515 |
| 2513 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha
t the copy rect is | 2516 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha
t the copy rect is |
| 2514 // relative to is output. | 2517 // relative to is output. |
| 2515 GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
Rect* viewport) { | 2518 GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
Rect* viewport, |
| 2519 TempFBOTarget tempFBOTarget) { |
| 2516 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge
t()); | 2520 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge
t()); |
| 2517 GrGLuint tempFBOID; | |
| 2518 if (NULL == rt) { | 2521 if (NULL == rt) { |
| 2519 SkASSERT(surface->asTexture()); | 2522 SkASSERT(surface->asTexture()); |
| 2520 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur
eID(); | 2523 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur
eID(); |
| 2521 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID)); | 2524 GrGLuint* tempFBOID; |
| 2525 tempFBOID = kSrc_TempFBOTarget == tempFBOTarget ? &fTempSrcFBOID : &fTem
pDstFBOID; |
| 2526 |
| 2527 if (0 == *tempFBOID) { |
| 2528 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, tempFBOID)); |
| 2529 } |
| 2530 |
| 2522 fStats.incRenderTargetBinds(); | 2531 fStats.incRenderTargetBinds(); |
| 2523 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID)); | 2532 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, *tempFBOID)); |
| 2524 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, | 2533 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, |
| 2525 GR_GL_COLOR_ATTACHM
ENT0, | 2534 GR_GL_COLOR_ATTACHM
ENT0, |
| 2526 GR_GL_TEXTURE_2D, | 2535 GR_GL_TEXTURE_2D, |
| 2527 texID, | 2536 texID, |
| 2528 0)); | 2537 0)); |
| 2529 viewport->fLeft = 0; | 2538 viewport->fLeft = 0; |
| 2530 viewport->fBottom = 0; | 2539 viewport->fBottom = 0; |
| 2531 viewport->fWidth = surface->width(); | 2540 viewport->fWidth = surface->width(); |
| 2532 viewport->fHeight = surface->height(); | 2541 viewport->fHeight = surface->height(); |
| 2542 return *tempFBOID; |
| 2533 } else { | 2543 } else { |
| 2534 tempFBOID = 0; | 2544 GrGLuint tempFBOID = 0; |
| 2535 fStats.incRenderTargetBinds(); | 2545 fStats.incRenderTargetBinds(); |
| 2536 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); | 2546 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); |
| 2537 *viewport = rt->getViewport(); | 2547 *viewport = rt->getViewport(); |
| 2548 return tempFBOID; |
| 2538 } | 2549 } |
| 2539 return tempFBOID; | 2550 } |
| 2551 |
| 2552 void GrGLGpu::unbindTextureFromFBO(GrGLenum fboTarget) { |
| 2553 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, |
| 2554 GR_GL_COLOR_ATTACHMENT0
, |
| 2555 GR_GL_TEXTURE_2D, |
| 2556 0, |
| 2557 0)); |
| 2540 } | 2558 } |
| 2541 | 2559 |
| 2542 bool GrGLGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc)
{ | 2560 bool GrGLGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc)
{ |
| 2543 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If
neither are | 2561 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If
neither are |
| 2544 // possible and we return false to fallback to creating a render target dst
for render-to- | 2562 // possible and we return false to fallback to creating a render target dst
for render-to- |
| 2545 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger
ing temporary fbo | 2563 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger
ing temporary fbo |
| 2546 // creation. It isn't clear that avoiding temporary fbo creation is actually
optimal. | 2564 // creation. It isn't clear that avoiding temporary fbo creation is actually
optimal. |
| 2547 | 2565 |
| 2548 // Check for format issues with glCopyTexSubImage2D | 2566 // Check for format issues with glCopyTexSubImage2D |
| 2549 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && | 2567 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2583 } | 2601 } |
| 2584 | 2602 |
| 2585 bool GrGLGpu::copySurface(GrSurface* dst, | 2603 bool GrGLGpu::copySurface(GrSurface* dst, |
| 2586 GrSurface* src, | 2604 GrSurface* src, |
| 2587 const SkIRect& srcRect, | 2605 const SkIRect& srcRect, |
| 2588 const SkIPoint& dstPoint) { | 2606 const SkIPoint& dstPoint) { |
| 2589 bool copied = false; | 2607 bool copied = false; |
| 2590 if (can_copy_texsubimage(dst, src, this)) { | 2608 if (can_copy_texsubimage(dst, src, this)) { |
| 2591 GrGLuint srcFBO; | 2609 GrGLuint srcFBO; |
| 2592 GrGLIRect srcVP; | 2610 GrGLIRect srcVP; |
| 2593 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_FRAMEBUFFER, &srcVP); | 2611 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_FRAMEBUFFER, &srcVP, kSrc_Tem
pFBOTarget); |
| 2594 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); | 2612 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); |
| 2595 SkASSERT(dstTex); | 2613 SkASSERT(dstTex); |
| 2596 // We modified the bound FBO | 2614 // We modified the bound FBO |
| 2597 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 2615 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
| 2598 GrGLIRect srcGLRect; | 2616 GrGLIRect srcGLRect; |
| 2599 srcGLRect.setRelativeTo(srcVP, | 2617 srcGLRect.setRelativeTo(srcVP, |
| 2600 srcRect.fLeft, | 2618 srcRect.fLeft, |
| 2601 srcRect.fTop, | 2619 srcRect.fTop, |
| 2602 srcRect.width(), | 2620 srcRect.width(), |
| 2603 srcRect.height(), | 2621 srcRect.height(), |
| 2604 src->origin()); | 2622 src->origin()); |
| 2605 | 2623 |
| 2606 this->setScratchTextureUnit(); | 2624 this->setScratchTextureUnit(); |
| 2607 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, dstTex->textureID())); | 2625 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, dstTex->textureID())); |
| 2608 GrGLint dstY; | 2626 GrGLint dstY; |
| 2609 if (kBottomLeft_GrSurfaceOrigin == dst->origin()) { | 2627 if (kBottomLeft_GrSurfaceOrigin == dst->origin()) { |
| 2610 dstY = dst->height() - (dstPoint.fY + srcGLRect.fHeight); | 2628 dstY = dst->height() - (dstPoint.fY + srcGLRect.fHeight); |
| 2611 } else { | 2629 } else { |
| 2612 dstY = dstPoint.fY; | 2630 dstY = dstPoint.fY; |
| 2613 } | 2631 } |
| 2614 GL_CALL(CopyTexSubImage2D(GR_GL_TEXTURE_2D, 0, | 2632 GL_CALL(CopyTexSubImage2D(GR_GL_TEXTURE_2D, 0, |
| 2615 dstPoint.fX, dstY, | 2633 dstPoint.fX, dstY, |
| 2616 srcGLRect.fLeft, srcGLRect.fBottom, | 2634 srcGLRect.fLeft, srcGLRect.fBottom, |
| 2617 srcGLRect.fWidth, srcGLRect.fHeight)); | 2635 srcGLRect.fWidth, srcGLRect.fHeight)); |
| 2618 copied = true; | 2636 copied = true; |
| 2619 if (srcFBO) { | 2637 if (srcFBO) { |
| 2620 GL_CALL(DeleteFramebuffers(1, &srcFBO)); | 2638 this->unbindTextureFromFBO(GR_GL_FRAMEBUFFER); |
| 2621 } | 2639 } |
| 2622 } else if (can_blit_framebuffer(dst, src, this)) { | 2640 } else if (can_blit_framebuffer(dst, src, this)) { |
| 2623 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, | 2641 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, |
| 2624 srcRect.width(), srcRect.height()); | 2642 srcRect.width(), srcRect.height()); |
| 2625 bool selfOverlap = false; | 2643 bool selfOverlap = false; |
| 2626 if (dst == src) { | 2644 if (dst == src) { |
| 2627 selfOverlap = SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect); | 2645 selfOverlap = SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect); |
| 2628 } | 2646 } |
| 2629 | 2647 |
| 2630 if (!selfOverlap) { | 2648 if (!selfOverlap) { |
| 2631 GrGLuint dstFBO; | 2649 GrGLuint dstFBO; |
| 2632 GrGLuint srcFBO; | 2650 GrGLuint srcFBO; |
| 2633 GrGLIRect dstVP; | 2651 GrGLIRect dstVP; |
| 2634 GrGLIRect srcVP; | 2652 GrGLIRect srcVP; |
| 2635 dstFBO = this->bindSurfaceAsFBO(dst, GR_GL_DRAW_FRAMEBUFFER, &dstVP)
; | 2653 dstFBO = this->bindSurfaceAsFBO(dst, GR_GL_DRAW_FRAMEBUFFER, &dstVP, |
| 2636 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_READ_FRAMEBUFFER, &srcVP)
; | 2654 kDst_TempFBOTarget); |
| 2655 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_READ_FRAMEBUFFER, &srcVP, |
| 2656 kSrc_TempFBOTarget); |
| 2637 // We modified the bound FBO | 2657 // We modified the bound FBO |
| 2638 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 2658 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
| 2639 GrGLIRect srcGLRect; | 2659 GrGLIRect srcGLRect; |
| 2640 GrGLIRect dstGLRect; | 2660 GrGLIRect dstGLRect; |
| 2641 srcGLRect.setRelativeTo(srcVP, | 2661 srcGLRect.setRelativeTo(srcVP, |
| 2642 srcRect.fLeft, | 2662 srcRect.fLeft, |
| 2643 srcRect.fTop, | 2663 srcRect.fTop, |
| 2644 srcRect.width(), | 2664 srcRect.width(), |
| 2645 srcRect.height(), | 2665 srcRect.height(), |
| 2646 src->origin()); | 2666 src->origin()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2667 GL_CALL(BlitFramebuffer(srcGLRect.fLeft, | 2687 GL_CALL(BlitFramebuffer(srcGLRect.fLeft, |
| 2668 srcY0, | 2688 srcY0, |
| 2669 srcGLRect.fLeft + srcGLRect.fWidth, | 2689 srcGLRect.fLeft + srcGLRect.fWidth, |
| 2670 srcY1, | 2690 srcY1, |
| 2671 dstGLRect.fLeft, | 2691 dstGLRect.fLeft, |
| 2672 dstGLRect.fBottom, | 2692 dstGLRect.fBottom, |
| 2673 dstGLRect.fLeft + dstGLRect.fWidth, | 2693 dstGLRect.fLeft + dstGLRect.fWidth, |
| 2674 dstGLRect.fBottom + dstGLRect.fHeight, | 2694 dstGLRect.fBottom + dstGLRect.fHeight, |
| 2675 GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST)); | 2695 GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST)); |
| 2676 if (dstFBO) { | 2696 if (dstFBO) { |
| 2677 GL_CALL(DeleteFramebuffers(1, &dstFBO)); | 2697 this->unbindTextureFromFBO(GR_GL_DRAW_FRAMEBUFFER); |
| 2678 } | 2698 } |
| 2679 if (srcFBO) { | 2699 if (srcFBO) { |
| 2680 GL_CALL(DeleteFramebuffers(1, &srcFBO)); | 2700 this->unbindTextureFromFBO(GR_GL_READ_FRAMEBUFFER); |
| 2681 } | 2701 } |
| 2682 copied = true; | 2702 copied = true; |
| 2683 } | 2703 } |
| 2684 } | 2704 } |
| 2685 return copied; | 2705 return copied; |
| 2686 } | 2706 } |
| 2687 | 2707 |
| 2688 bool GrGLGpu::canCopySurface(const GrSurface* dst, | 2708 bool GrGLGpu::canCopySurface(const GrSurface* dst, |
| 2689 const GrSurface* src, | 2709 const GrSurface* src, |
| 2690 const SkIRect& srcRect, | 2710 const SkIRect& srcRect, |
| 2691 const SkIPoint& dstPoint) { | 2711 const SkIPoint& dstPoint) { |
| 2692 // This mirrors the logic in onCopySurface. We prefer our base makes the co
py if we need to | 2712 // This mirrors the logic in onCopySurface. |
| 2693 // create a temp fbo. TODO verify the assumption that temp fbos are expensiv
e; it may not be | 2713 if (can_copy_texsubimage(dst, src, this)) { |
| 2694 // true at all. | |
| 2695 bool wouldNeedTempFBO = false; | |
| 2696 if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { | |
| 2697 return true; | 2714 return true; |
| 2698 } | 2715 } |
| 2699 if (can_blit_framebuffer(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { | 2716 if (can_blit_framebuffer(dst, src, this)) { |
| 2700 if (dst == src) { | 2717 if (dst == src) { |
| 2701 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, | 2718 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, |
| 2702 srcRect.width(), srcRect.height(
)); | 2719 srcRect.width(), srcRect.height(
)); |
| 2703 if(!SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect)) { | 2720 if(!SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect)) { |
| 2704 return true; | 2721 return true; |
| 2705 } | 2722 } |
| 2706 } else { | 2723 } else { |
| 2707 return true; | 2724 return true; |
| 2708 } | 2725 } |
| 2709 } | 2726 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2750 this->setVertexArrayID(gpu, 0); | 2767 this->setVertexArrayID(gpu, 0); |
| 2751 } | 2768 } |
| 2752 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2769 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2753 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2770 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2754 fDefaultVertexArrayAttribState.resize(attrCount); | 2771 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2755 } | 2772 } |
| 2756 attribState = &fDefaultVertexArrayAttribState; | 2773 attribState = &fDefaultVertexArrayAttribState; |
| 2757 } | 2774 } |
| 2758 return attribState; | 2775 return attribState; |
| 2759 } | 2776 } |
| OLD | NEW |