| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010, Google Inc. All rights reserved. | 2 * Copyright (c) 2010, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 m_context->clear(clearMask); | 182 m_context->clear(clearMask); |
| 183 | 183 |
| 184 // The multisample fbo was just cleared, but we also need to clear the non-m
ultisampled buffer too. | 184 // The multisample fbo was just cleared, but we also need to clear the non-m
ultisampled buffer too. |
| 185 if (m_multisampleFBO) { | 185 if (m_multisampleFBO) { |
| 186 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); | 186 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); |
| 187 m_context->clear(GraphicsContext3D::COLOR_BUFFER_BIT); | 187 m_context->clear(GraphicsContext3D::COLOR_BUFFER_BIT); |
| 188 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisample
FBO); | 188 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisample
FBO); |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 // Only way to ensure that we're not getting a bad framebuffer on some AMD/OSX d
evices. |
| 193 // FIXME: This can be removed once renderbufferStorageMultisample starts reporti
ng GL_OUT_OF_MEMORY properly. |
| 194 bool DrawingBuffer::checkBufferIntegrity() |
| 195 { |
| 196 if (!m_multisampleFBO) |
| 197 return true; |
| 198 |
| 199 if (m_scissorEnabled) |
| 200 m_context->disable(GraphicsContext3D::SCISSOR_TEST); |
| 201 |
| 202 m_context->colorMask(true, true, true, true); |
| 203 |
| 204 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO)
; |
| 205 m_context->clearColor(1.0f, 0.0f, 1.0f, 1.0f); |
| 206 m_context->clear(GraphicsContext3D::COLOR_BUFFER_BIT); |
| 207 |
| 208 commit(0, 0, 1, 1); |
| 209 |
| 210 unsigned char pixel[4] = {0, 0, 0, 0}; |
| 211 m_context->readPixels(0, 0, 1, 1, GraphicsContext3D::RGBA, GraphicsContext3D
::UNSIGNED_BYTE, &pixel); |
| 212 |
| 213 if (m_scissorEnabled) |
| 214 m_context->enable(GraphicsContext3D::SCISSOR_TEST); |
| 215 |
| 216 return (pixel[0] == 0xFF && pixel[1] == 0x00 && pixel[2] == 0xFF && pixel[3]
== 0xFF); |
| 217 } |
| 218 |
| 192 bool DrawingBuffer::reset(const IntSize& newSize) | 219 bool DrawingBuffer::reset(const IntSize& newSize) |
| 193 { | 220 { |
| 194 if (!m_context) | 221 if (!m_context) |
| 195 return false; | 222 return false; |
| 196 | 223 |
| 197 m_context->makeContextCurrent(); | 224 m_context->makeContextCurrent(); |
| 198 | 225 |
| 199 int maxTextureSize = 0; | 226 int maxTextureSize = 0; |
| 200 m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize)
; | 227 m_context->getIntegerv(GraphicsContext3D::MAX_TEXTURE_SIZE, &maxTextureSize)
; |
| 201 if (newSize.height() > maxTextureSize || newSize.width() > maxTextureSize) { | 228 if (newSize.height() > maxTextureSize || newSize.width() > maxTextureSize) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 231 if (attributes.alpha) { | 258 if (attributes.alpha) { |
| 232 internalColorFormat = GraphicsContext3D::RGBA; | 259 internalColorFormat = GraphicsContext3D::RGBA; |
| 233 colorFormat = GraphicsContext3D::RGBA; | 260 colorFormat = GraphicsContext3D::RGBA; |
| 234 internalRenderbufferFormat = Extensions3D::RGBA8_OES; | 261 internalRenderbufferFormat = Extensions3D::RGBA8_OES; |
| 235 } else { | 262 } else { |
| 236 internalColorFormat = GraphicsContext3D::RGB; | 263 internalColorFormat = GraphicsContext3D::RGB; |
| 237 colorFormat = GraphicsContext3D::RGB; | 264 colorFormat = GraphicsContext3D::RGB; |
| 238 internalRenderbufferFormat = Extensions3D::RGB8_OES; | 265 internalRenderbufferFormat = Extensions3D::RGB8_OES; |
| 239 } | 266 } |
| 240 | 267 |
| 241 | |
| 242 do { | 268 do { |
| 243 m_size = adjustedSize; | 269 m_size = adjustedSize; |
| 244 // resize multisample FBO | 270 // resize multisample FBO |
| 245 if (multisample()) { | 271 if (multisample()) { |
| 246 int maxSampleCount = 0; | 272 int maxSampleCount = 0; |
| 247 | 273 |
| 248 m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCoun
t); | 274 m_context->getIntegerv(Extensions3D::MAX_SAMPLES, &maxSampleCoun
t); |
| 249 int sampleCount = std::min(4, maxSampleCount); | 275 int sampleCount = std::min(4, maxSampleCount); |
| 250 | 276 |
| 251 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_mul
tisampleFBO); | 277 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_mul
tisampleFBO); |
| 252 | 278 |
| 253 m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_m
ultisampleColorBuffer); | 279 m_context->bindRenderbuffer(GraphicsContext3D::RENDERBUFFER, m_m
ultisampleColorBuffer); |
| 254 m_context->getExtensions()->renderbufferStorageMultisample(Graph
icsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.widt
h(), m_size.height()); | 280 m_context->getExtensions()->renderbufferStorageMultisample(Graph
icsContext3D::RENDERBUFFER, sampleCount, internalRenderbufferFormat, m_size.widt
h(), m_size.height()); |
| 281 |
| 282 if (m_context->getError() == GraphicsContext3D::OUT_OF_MEMORY) { |
| 283 adjustedSize.scale(s_resourceAdjustedRatio); |
| 284 continue; |
| 285 } |
| 286 |
| 255 m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFE
R, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_mult
isampleColorBuffer); | 287 m_context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFE
R, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::RENDERBUFFER, m_mult
isampleColorBuffer); |
| 256 resizeDepthStencil(sampleCount); | 288 resizeDepthStencil(sampleCount); |
| 257 if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBU
FFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) { | 289 if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBU
FFER) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) { |
| 258 adjustedSize.scale(s_resourceAdjustedRatio); | 290 adjustedSize.scale(s_resourceAdjustedRatio); |
| 259 continue; | 291 continue; |
| 260 } | 292 } |
| 261 } | 293 } |
| 262 | 294 |
| 263 // resize regular FBO | 295 // resize regular FBO |
| 264 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); | 296 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_fbo); |
| 265 | 297 |
| 266 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer)
; | 298 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_colorBuffer)
; |
| 267 m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColo
rFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNS
IGNED_BYTE, 0); | 299 m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internalColo
rFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D::UNS
IGNED_BYTE, 0); |
| 268 | 300 |
| 269 m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, Grap
hicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer,
0); | 301 m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, Grap
hicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_colorBuffer,
0); |
| 270 | 302 |
| 271 // resize the front color buffer | 303 // resize the front color buffer |
| 272 if (m_separateFrontTexture) { | 304 if (m_separateFrontTexture) { |
| 273 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_frontCol
orBuffer); | 305 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_frontCol
orBuffer); |
| 274 m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internal
ColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D:
:UNSIGNED_BYTE, 0); | 306 m_context->texImage2D(GraphicsContext3D::TEXTURE_2D, 0, internal
ColorFormat, m_size.width(), m_size.height(), 0, colorFormat, GraphicsContext3D:
:UNSIGNED_BYTE, 0); |
| 275 } | 307 } |
| 276 | 308 |
| 277 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0); | 309 m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0); |
| 278 | 310 |
| 279 if (!multisample()) | 311 if (!multisample()) |
| 280 resizeDepthStencil(0); | 312 resizeDepthStencil(0); |
| 281 if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER
) == GraphicsContext3D::FRAMEBUFFER_COMPLETE) | 313 if (m_context->checkFramebufferStatus(GraphicsContext3D::FRAMEBUFFER
) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) { |
| 282 break; | 314 adjustedSize.scale(s_resourceAdjustedRatio); |
| 283 adjustedSize.scale(s_resourceAdjustedRatio); | 315 continue; |
| 316 } |
| 317 |
| 318 #if OS(DARWIN) |
| 319 // FIXME: This can be removed once renderbufferStorageMultisample st
arts reporting GL_OUT_OF_MEMORY properly on OSX. |
| 320 if (!checkBufferIntegrity()) { |
| 321 adjustedSize.scale(s_resourceAdjustedRatio); |
| 322 continue; |
| 323 } |
| 324 #endif |
| 325 |
| 326 break; |
| 284 | 327 |
| 285 } while (!adjustedSize.isEmpty()); | 328 } while (!adjustedSize.isEmpty()); |
| 286 | 329 |
| 287 pixelDelta = m_size.width() * m_size.height(); | 330 pixelDelta = m_size.width() * m_size.height(); |
| 288 pixelDelta -= oldSize; | 331 pixelDelta -= oldSize; |
| 289 s_currentResourceUsePixels += pixelDelta; | 332 s_currentResourceUsePixels += pixelDelta; |
| 290 | 333 |
| 291 if (!newSize.isEmpty() && adjustedSize.isEmpty()) { | 334 if (!newSize.isEmpty() && adjustedSize.isEmpty()) { |
| 292 clear(); | 335 clear(); |
| 293 return false; | 336 return false; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 { | 424 { |
| 382 if (!m_context) | 425 if (!m_context) |
| 383 return; | 426 return; |
| 384 | 427 |
| 385 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO
? m_multisampleFBO : m_fbo); | 428 m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_multisampleFBO
? m_multisampleFBO : m_fbo); |
| 386 } | 429 } |
| 387 | 430 |
| 388 } // namespace WebCore | 431 } // namespace WebCore |
| 389 | 432 |
| 390 #endif | 433 #endif |
| OLD | NEW |