| 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 #include "GrGLGpu.h" | 8 #include "GrGLGpu.h" |
| 9 #include "GrGLBuffer.h" | 9 #include "GrGLBuffer.h" |
| 10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
| (...skipping 4296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4307 dstGLRect.fBottom, | 4307 dstGLRect.fBottom, |
| 4308 dstGLRect.fLeft + dstGLRect.fWidth, | 4308 dstGLRect.fLeft + dstGLRect.fWidth, |
| 4309 dstGLRect.fBottom + dstGLRect.fHeight, | 4309 dstGLRect.fBottom + dstGLRect.fHeight, |
| 4310 GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST)); | 4310 GR_GL_COLOR_BUFFER_BIT, GR_GL_NEAREST)); |
| 4311 this->unbindTextureFBOForCopy(GR_GL_DRAW_FRAMEBUFFER, dst); | 4311 this->unbindTextureFBOForCopy(GR_GL_DRAW_FRAMEBUFFER, dst); |
| 4312 this->unbindTextureFBOForCopy(GR_GL_READ_FRAMEBUFFER, src); | 4312 this->unbindTextureFBOForCopy(GR_GL_READ_FRAMEBUFFER, src); |
| 4313 this->didWriteToSurface(dst, &dstRect); | 4313 this->didWriteToSurface(dst, &dstRect); |
| 4314 return true; | 4314 return true; |
| 4315 } | 4315 } |
| 4316 | 4316 |
| 4317 bool gManualMipmaps = true; | |
| 4318 | |
| 4319 // Manual implementation of mipmap generation, to work around driver bugs w/sRGB
. | 4317 // Manual implementation of mipmap generation, to work around driver bugs w/sRGB
. |
| 4320 // Uses draw calls to do a series of downsample operations to successive mips. | 4318 // Uses draw calls to do a series of downsample operations to successive mips. |
| 4321 // If this returns false, then the calling code falls back to using glGenerateMi
pmap. | 4319 // If this returns false, then the calling code falls back to using glGenerateMi
pmap. |
| 4322 bool GrGLGpu::generateMipmap(GrGLTexture* texture, bool gammaCorrect) { | 4320 bool GrGLGpu::generateMipmap(GrGLTexture* texture, bool gammaCorrect) { |
| 4323 // Global switch for manual mipmap generation: | 4321 // Our iterative downsample requires the ability to limit which level we're
sampling: |
| 4324 if (!gManualMipmaps) { | 4322 if (!this->glCaps().doManualMipmapping()) { |
| 4325 return false; | 4323 return false; |
| 4326 } | 4324 } |
| 4327 | 4325 |
| 4328 // Mipmaps are only supported on 2D textures: | 4326 // Mipmaps are only supported on 2D textures: |
| 4329 if (GR_GL_TEXTURE_2D != texture->target()) { | 4327 if (GR_GL_TEXTURE_2D != texture->target()) { |
| 4330 return false; | 4328 return false; |
| 4331 } | 4329 } |
| 4332 | 4330 |
| 4333 // We need to be able to render to the texture for this to work: | 4331 // We need to be able to render to the texture for this to work: |
| 4334 if (!this->caps()->isConfigRenderable(texture->config(), false)) { | 4332 if (!this->caps()->isConfigRenderable(texture->config(), false)) { |
| 4335 return false; | 4333 return false; |
| 4336 } | 4334 } |
| 4337 | 4335 |
| 4338 // Our iterative downsample requires the ability to limit which level we're
sampling: | |
| 4339 if (!this->glCaps().mipMapLevelAndLodControlSupport()) { | |
| 4340 return false; | |
| 4341 } | |
| 4342 | |
| 4343 // If we're mipping an sRGB texture, we need to ensure FB sRGB is correct: | 4336 // If we're mipping an sRGB texture, we need to ensure FB sRGB is correct: |
| 4344 if (GrPixelConfigIsSRGB(texture->config())) { | 4337 if (GrPixelConfigIsSRGB(texture->config())) { |
| 4345 // If we have write-control, just set the state that we want: | 4338 // If we have write-control, just set the state that we want: |
| 4346 if (this->glCaps().srgbWriteControl()) { | 4339 if (this->glCaps().srgbWriteControl()) { |
| 4347 this->flushFramebufferSRGB(gammaCorrect); | 4340 this->flushFramebufferSRGB(gammaCorrect); |
| 4348 } else if (!gammaCorrect) { | 4341 } else if (!gammaCorrect) { |
| 4349 // If we don't have write-control we can't do non-gamma-correct mipm
apping: | 4342 // If we don't have write-control we can't do non-gamma-correct mipm
apping: |
| 4350 return false; | 4343 return false; |
| 4351 } | 4344 } |
| 4352 } | 4345 } |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4647 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 4640 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
| 4648 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 4641 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
| 4649 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 4642 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
| 4650 copyParams->fWidth = texture->width(); | 4643 copyParams->fWidth = texture->width(); |
| 4651 copyParams->fHeight = texture->height(); | 4644 copyParams->fHeight = texture->height(); |
| 4652 return true; | 4645 return true; |
| 4653 } | 4646 } |
| 4654 } | 4647 } |
| 4655 return false; | 4648 return false; |
| 4656 } | 4649 } |
| OLD | NEW |