| 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 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 return kBGRA_8888_GrPixelConfig; | 256 return kBGRA_8888_GrPixelConfig; |
| 257 } else { | 257 } else { |
| 258 return writeConfig; | 258 return writeConfig; |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 | 261 |
| 262 bool GrGpuGL::canWriteTexturePixels(const GrTexture* texture, GrPixelConfig srcC
onfig) const { | 262 bool GrGpuGL::canWriteTexturePixels(const GrTexture* texture, GrPixelConfig srcC
onfig) const { |
| 263 if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture
->config()) { | 263 if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture
->config()) { |
| 264 return false; | 264 return false; |
| 265 } | 265 } |
| 266 if (srcConfig != texture->config() && kES2_GrGLBinding == this->glBinding())
{ | 266 if (srcConfig != texture->config() && kES_GrGLBinding == this->glBinding())
{ |
| 267 // In general ES2 requires the internal format of the texture and the fo
rmat of the src | 267 // In general ES2 requires the internal format of the texture and the fo
rmat of the src |
| 268 // pixels to match. However, It may or may not be possible to upload BGR
A data to a RGBA | 268 // pixels to match. However, It may or may not be possible to upload BGR
A data to a RGBA |
| 269 // texture. It depends upon which extension added BGRA. The Apple extens
ion allows it | 269 // texture. It depends upon which extension added BGRA. The Apple extens
ion allows it |
| 270 // (BGRA's internal format is RGBA) while the EXT extension does not (BG
RA is its own | 270 // (BGRA's internal format is RGBA) while the EXT extension does not (BG
RA is its own |
| 271 // internal format). | 271 // internal format). |
| 272 if (this->glCaps().bgraFormatSupport() && | 272 if (this->glCaps().bgraFormatSupport() && |
| 273 !this->glCaps().bgraIsInternalFormat() && | 273 !this->glCaps().bgraIsInternalFormat() && |
| 274 kBGRA_8888_GrPixelConfig == srcConfig && | 274 kBGRA_8888_GrPixelConfig == srcConfig && |
| 275 kRGBA_8888_GrPixelConfig == texture->config()) { | 275 kRGBA_8888_GrPixelConfig == texture->config()) { |
| 276 return true; | 276 return true; |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 // the texture bound to the other. The exception is the IMG multisample exte
nsion. With this | 803 // the texture bound to the other. The exception is the IMG multisample exte
nsion. With this |
| 804 // extension the texture is multisampled when rendered to and then auto-reso
lves it when it is | 804 // extension the texture is multisampled when rendered to and then auto-reso
lves it when it is |
| 805 // rendered from. | 805 // rendered from. |
| 806 if (desc->fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) { | 806 if (desc->fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) { |
| 807 GL_CALL(GenFramebuffers(1, &desc->fRTFBOID)); | 807 GL_CALL(GenFramebuffers(1, &desc->fRTFBOID)); |
| 808 GL_CALL(GenRenderbuffers(1, &desc->fMSColorRenderbufferID)); | 808 GL_CALL(GenRenderbuffers(1, &desc->fMSColorRenderbufferID)); |
| 809 if (!desc->fRTFBOID || | 809 if (!desc->fRTFBOID || |
| 810 !desc->fMSColorRenderbufferID || | 810 !desc->fMSColorRenderbufferID || |
| 811 !this->configToGLFormats(desc->fConfig, | 811 !this->configToGLFormats(desc->fConfig, |
| 812 // GLES requires sized internal formats | 812 // GLES requires sized internal formats |
| 813 kES2_GrGLBinding == this->glBinding(), | 813 kES_GrGLBinding == this->glBinding(), |
| 814 &msColorFormat, | 814 &msColorFormat, |
| 815 NULL, | 815 NULL, |
| 816 NULL)) { | 816 NULL)) { |
| 817 goto FAILED; | 817 goto FAILED; |
| 818 } | 818 } |
| 819 } else { | 819 } else { |
| 820 desc->fRTFBOID = desc->fTexFBOID; | 820 desc->fRTFBOID = desc->fTexFBOID; |
| 821 } | 821 } |
| 822 | 822 |
| 823 // below here we may bind the FBO | 823 // below here we may bind the FBO |
| (...skipping 1472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2296 } | 2296 } |
| 2297 } | 2297 } |
| 2298 | 2298 |
| 2299 inline bool can_copy_texsubimage(const GrSurface* dst, | 2299 inline bool can_copy_texsubimage(const GrSurface* dst, |
| 2300 const GrSurface* src, | 2300 const GrSurface* src, |
| 2301 const GrGpuGL* gpu, | 2301 const GrGpuGL* gpu, |
| 2302 bool* wouldNeedTempFBO = NULL) { | 2302 bool* wouldNeedTempFBO = NULL) { |
| 2303 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image | 2303 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image |
| 2304 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps | 2304 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps |
| 2305 // many drivers would allow it to work, but ANGLE does not. | 2305 // many drivers would allow it to work, but ANGLE does not. |
| 2306 if (kES2_GrGLBinding == gpu->glBinding() && gpu->glCaps().bgraIsInternalForm
at() && | 2306 if (kES_GrGLBinding == gpu->glBinding() && gpu->glCaps().bgraIsInternalForma
t() && |
| 2307 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { | 2307 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { |
| 2308 return false; | 2308 return false; |
| 2309 } | 2309 } |
| 2310 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); | 2310 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); |
| 2311 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) | 2311 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) |
| 2312 // then we don't want to copy to the texture but to the MSAA buffer. | 2312 // then we don't want to copy to the texture but to the MSAA buffer. |
| 2313 if (NULL != dstRT && dstRT->renderFBOID() != dstRT->textureFBOID()) { | 2313 if (NULL != dstRT && dstRT->renderFBOID() != dstRT->textureFBOID()) { |
| 2314 return false; | 2314 return false; |
| 2315 } | 2315 } |
| 2316 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); | 2316 const GrGLRenderTarget* srcRT = static_cast<const GrGLRenderTarget*>(src->as
RenderTarget()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2357 GR_GL_CALL(gl, BindFramebuffer(fboTarget, rt->renderFBOID())); | 2357 GR_GL_CALL(gl, BindFramebuffer(fboTarget, rt->renderFBOID())); |
| 2358 *viewport = rt->getViewport(); | 2358 *viewport = rt->getViewport(); |
| 2359 } | 2359 } |
| 2360 return tempFBOID; | 2360 return tempFBOID; |
| 2361 } | 2361 } |
| 2362 | 2362 |
| 2363 } | 2363 } |
| 2364 | 2364 |
| 2365 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc)
{ | 2365 void GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* desc)
{ |
| 2366 // Check for format issues with glCopyTexSubImage2D | 2366 // Check for format issues with glCopyTexSubImage2D |
| 2367 if (kES2_GrGLBinding == this->glBinding() && this->glCaps().bgraIsInternalFo
rmat() && | 2367 if (kES_GrGLBinding == this->glBinding() && this->glCaps().bgraIsInternalFor
mat() && |
| 2368 kBGRA_8888_GrPixelConfig == src->config()) { | 2368 kBGRA_8888_GrPixelConfig == src->config()) { |
| 2369 // glCopyTexSubImage2D doesn't work with this config. We'll want to make
it a render target | 2369 // glCopyTexSubImage2D doesn't work with this config. We'll want to make
it a render target |
| 2370 // in order to call glBlitFramebuffer or to copy to it by rendering. | 2370 // in order to call glBlitFramebuffer or to copy to it by rendering. |
| 2371 INHERITED::initCopySurfaceDstDesc(src, desc); | 2371 INHERITED::initCopySurfaceDstDesc(src, desc); |
| 2372 return; | 2372 return; |
| 2373 } else if (NULL == src->asRenderTarget()) { | 2373 } else if (NULL == src->asRenderTarget()) { |
| 2374 // We don't want to have to create an FBO just to use glCopyTexSubImage2
D. Let the base | 2374 // We don't want to have to create an FBO just to use glCopyTexSubImage2
D. Let the base |
| 2375 // class handle it by rendering. | 2375 // class handle it by rendering. |
| 2376 INHERITED::initCopySurfaceDstDesc(src, desc); | 2376 INHERITED::initCopySurfaceDstDesc(src, desc); |
| 2377 return; | 2377 return; |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2552 this->setVertexArrayID(gpu, 0); | 2552 this->setVertexArrayID(gpu, 0); |
| 2553 } | 2553 } |
| 2554 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2554 int attrCount = gpu->glCaps().maxVertexAttributes(); |
| 2555 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2555 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
| 2556 fDefaultVertexArrayAttribState.resize(attrCount); | 2556 fDefaultVertexArrayAttribState.resize(attrCount); |
| 2557 } | 2557 } |
| 2558 attribState = &fDefaultVertexArrayAttribState; | 2558 attribState = &fDefaultVertexArrayAttribState; |
| 2559 } | 2559 } |
| 2560 return attribState; | 2560 return attribState; |
| 2561 } | 2561 } |
| OLD | NEW |