Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: Source/platform/graphics/gpu/DrawingBuffer.cpp

Issue 163773007: WebGL: Transfer ownership of WebGraphicsContext3D from WebGLRenderingContext to DrawingBuffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@correct_webgl_destroy
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 m_context->bindTexture(GL_TEXTURE_2D, m_oldTextureUnitZeroId); 70 m_context->bindTexture(GL_TEXTURE_2D, m_oldTextureUnitZeroId);
71 m_context->activeTexture(m_oldActiveTextureUnit); 71 m_context->activeTexture(m_oldActiveTextureUnit);
72 } 72 }
73 73
74 private: 74 private:
75 blink::WebGraphicsContext3D* m_context; 75 blink::WebGraphicsContext3D* m_context;
76 GLenum m_oldActiveTextureUnit; 76 GLenum m_oldActiveTextureUnit;
77 Platform3DObject m_oldTextureUnitZeroId; 77 Platform3DObject m_oldTextureUnitZeroId;
78 }; 78 };
79 79
80 PassRefPtr<DrawingBuffer> DrawingBuffer::create(blink::WebGraphicsContext3D* con text, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr<ContextEvi ctionManager> contextEvictionManager) 80 PassRefPtr<DrawingBuffer> DrawingBuffer::create(PassOwnPtr<blink::WebGraphicsCon text3D> context, const IntSize& size, PreserveDrawingBuffer preserve, PassRefPtr <ContextEvictionManager> contextEvictionManager)
81 { 81 {
82 Extensions3DUtil extensionsUtil(context); 82 ASSERT(context);
83 Extensions3DUtil extensionsUtil(context.get());
83 bool multisampleSupported = extensionsUtil.supportsExtension("GL_CHROMIUM_fr amebuffer_multisample") 84 bool multisampleSupported = extensionsUtil.supportsExtension("GL_CHROMIUM_fr amebuffer_multisample")
84 && extensionsUtil.supportsExtension("GL_OES_rgb8_rgba8"); 85 && extensionsUtil.supportsExtension("GL_OES_rgb8_rgba8");
85 if (multisampleSupported) { 86 if (multisampleSupported) {
86 extensionsUtil.ensureExtensionEnabled("GL_CHROMIUM_framebuffer_multisamp le"); 87 extensionsUtil.ensureExtensionEnabled("GL_CHROMIUM_framebuffer_multisamp le");
87 extensionsUtil.ensureExtensionEnabled("GL_OES_rgb8_rgba8"); 88 extensionsUtil.ensureExtensionEnabled("GL_OES_rgb8_rgba8");
88 } 89 }
89 bool packedDepthStencilSupported = extensionsUtil.supportsExtension("GL_OES_ packed_depth_stencil"); 90 bool packedDepthStencilSupported = extensionsUtil.supportsExtension("GL_OES_ packed_depth_stencil");
90 if (packedDepthStencilSupported) 91 if (packedDepthStencilSupported)
91 extensionsUtil.ensureExtensionEnabled("GL_OES_packed_depth_stencil"); 92 extensionsUtil.ensureExtensionEnabled("GL_OES_packed_depth_stencil");
92 93
93 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, si ze, multisampleSupported, packedDepthStencilSupported, preserve, contextEviction Manager)); 94 RefPtr<DrawingBuffer> drawingBuffer = adoptRef(new DrawingBuffer(context, mu ltisampleSupported, packedDepthStencilSupported, preserve, contextEvictionManage r));
95 if (!drawingBuffer->initialize(size))
96 return PassRefPtr<DrawingBuffer>();
94 return drawingBuffer.release(); 97 return drawingBuffer.release();
95 } 98 }
96 99
97 DrawingBuffer::DrawingBuffer(blink::WebGraphicsContext3D* context, 100 DrawingBuffer::DrawingBuffer(PassOwnPtr<blink::WebGraphicsContext3D> context,
98 const IntSize& size,
99 bool multisampleExtensionSupported, 101 bool multisampleExtensionSupported,
100 bool packedDepthStencilExtensionSupported, 102 bool packedDepthStencilExtensionSupported,
101 PreserveDrawingBuffer preserve, 103 PreserveDrawingBuffer preserve,
102 PassRefPtr<ContextEvictionManager> contextEvictionManager) 104 PassRefPtr<ContextEvictionManager> contextEvictionManager)
103 : m_preserveDrawingBuffer(preserve) 105 : m_preserveDrawingBuffer(preserve)
104 , m_scissorEnabled(false) 106 , m_scissorEnabled(false)
105 , m_texture2DBinding(0) 107 , m_texture2DBinding(0)
106 , m_framebufferBinding(0) 108 , m_framebufferBinding(0)
107 , m_activeTextureUnit(GL_TEXTURE0) 109 , m_activeTextureUnit(GL_TEXTURE0)
108 , m_context(context) 110 , m_context(context)
109 , m_size(-1, -1) 111 , m_size(-1, -1)
110 , m_multisampleExtensionSupported(multisampleExtensionSupported) 112 , m_multisampleExtensionSupported(multisampleExtensionSupported)
111 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d) 113 , m_packedDepthStencilExtensionSupported(packedDepthStencilExtensionSupporte d)
112 , m_fbo(0) 114 , m_fbo(0)
113 , m_colorBuffer(0) 115 , m_colorBuffer(0)
114 , m_frontColorBuffer(0) 116 , m_frontColorBuffer(0)
115 , m_depthStencilBuffer(0) 117 , m_depthStencilBuffer(0)
116 , m_depthBuffer(0) 118 , m_depthBuffer(0)
117 , m_stencilBuffer(0) 119 , m_stencilBuffer(0)
118 , m_multisampleFBO(0) 120 , m_multisampleFBO(0)
119 , m_multisampleColorBuffer(0) 121 , m_multisampleColorBuffer(0)
120 , m_contentsChanged(true) 122 , m_contentsChanged(true)
121 , m_contentsChangeCommitted(false) 123 , m_contentsChangeCommitted(false)
122 , m_layerComposited(false) 124 , m_layerComposited(false)
123 , m_internalColorFormat(0) 125 , m_internalColorFormat(0)
124 , m_colorFormat(0) 126 , m_colorFormat(0)
125 , m_internalRenderbufferFormat(0) 127 , m_internalRenderbufferFormat(0)
126 , m_maxTextureSize(0) 128 , m_maxTextureSize(0)
129 , m_sampleCount(4)
127 , m_packAlignment(4) 130 , m_packAlignment(4)
128 , m_contextEvictionManager(contextEvictionManager) 131 , m_contextEvictionManager(contextEvictionManager)
129 { 132 {
130 // Used by browser tests to detect the use of a DrawingBuffer. 133 // Used by browser tests to detect the use of a DrawingBuffer.
131 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation"); 134 TRACE_EVENT_INSTANT0("test_gpu", "DrawingBufferCreation");
132 initialize(size);
133 } 135 }
134 136
135 DrawingBuffer::~DrawingBuffer() 137 DrawingBuffer::~DrawingBuffer()
136 { 138 {
137 releaseResources(); 139 releaseResources();
138 } 140 }
139 141
140 void DrawingBuffer::markContentsChanged() 142 void DrawingBuffer::markContentsChanged()
141 { 143 {
142 m_contentsChanged = true; 144 m_contentsChanged = true;
143 m_contentsChangeCommitted = false; 145 m_contentsChangeCommitted = false;
144 m_layerComposited = false; 146 m_layerComposited = false;
145 } 147 }
146 148
147 bool DrawingBuffer::layerComposited() const 149 bool DrawingBuffer::layerComposited() const
148 { 150 {
149 return m_layerComposited; 151 return m_layerComposited;
150 } 152 }
151 153
152 void DrawingBuffer::markLayerComposited() 154 void DrawingBuffer::markLayerComposited()
153 { 155 {
154 m_layerComposited = true; 156 m_layerComposited = true;
155 } 157 }
156 158
157 blink::WebGraphicsContext3D* DrawingBuffer::context() 159 blink::WebGraphicsContext3D* DrawingBuffer::context()
158 { 160 {
159 return m_context; 161 return m_context.get();
160 } 162 }
161 163
162 bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap) 164 bool DrawingBuffer::prepareMailbox(blink::WebExternalTextureMailbox* outMailbox, blink::WebExternalBitmap* bitmap)
163 { 165 {
164 if (!m_context || !m_contentsChanged) 166 if (!m_contentsChanged)
165 return false; 167 return false;
166 168
167 m_context->makeContextCurrent(); 169 m_context->makeContextCurrent();
168 170
169 // Resolve the multisampled buffer into m_colorBuffer texture. 171 // Resolve the multisampled buffer into m_colorBuffer texture.
170 if (multisample()) 172 if (multisample())
171 commit(); 173 commit();
172 174
173 if (bitmap) { 175 if (bitmap) {
174 bitmap->setSize(size()); 176 bitmap->setSize(size());
175 177
176 unsigned char* pixels = bitmap->pixels(); 178 unsigned char* pixels = bitmap->pixels();
177 bool needPremultiply = m_attributes.alpha && !m_attributes.premultiplied Alpha; 179 bool needPremultiply = m_attributes.alpha && !m_attributes.premultiplied Alpha;
178 WebGLImageConversion::AlphaOp op = needPremultiply ? WebGLImageConversio n::AlphaDoPremultiply : WebGLImageConversion::AlphaDoNothing; 180 WebGLImageConversion::AlphaOp op = needPremultiply ? WebGLImageConversio n::AlphaDoPremultiply : WebGLImageConversion::AlphaDoNothing;
179 if (pixels) 181 if (pixels)
180 readBackFramebuffer(pixels, size().width(), size().height(), Readbac kSkia, op); 182 readBackFramebuffer(pixels, size().width(), size().height(), Readbac kSkia, op);
181 } 183 }
182 184
183 // We must restore the texture binding since creating new textures, 185 // We must restore the texture binding since creating new textures,
184 // consuming and producing mailboxes changes it. 186 // consuming and producing mailboxes changes it.
185 ScopedTextureUnit0BindingRestorer restorer(m_context, m_activeTextureUnit, m _texture2DBinding); 187 ScopedTextureUnit0BindingRestorer restorer(m_context.get(), m_activeTextureU nit, m_texture2DBinding);
186 188
187 // First try to recycle an old buffer. 189 // First try to recycle an old buffer.
188 RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox(); 190 RefPtr<MailboxInfo> frontColorBufferMailbox = recycledMailbox();
189 191
190 // No buffer available to recycle, create a new one. 192 // No buffer available to recycle, create a new one.
191 if (!frontColorBufferMailbox) { 193 if (!frontColorBufferMailbox) {
192 unsigned newColorBuffer = createColorTexture(m_size); 194 unsigned newColorBuffer = createColorTexture(m_size);
193 // Bad things happened, abandon ship. 195 // Bad things happened, abandon ship.
194 if (!newColorBuffer) 196 if (!newColorBuffer)
195 return false; 197 return false;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 mailboxInfo->mailbox.syncPoint = mailbox.syncPoint; 237 mailboxInfo->mailbox.syncPoint = mailbox.syncPoint;
236 m_recycledMailboxes.prepend(mailboxInfo.release()); 238 m_recycledMailboxes.prepend(mailboxInfo.release());
237 return; 239 return;
238 } 240 }
239 } 241 }
240 ASSERT_NOT_REACHED(); 242 ASSERT_NOT_REACHED();
241 } 243 }
242 244
243 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::recycledMailbox() 245 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::recycledMailbox()
244 { 246 {
245 if (!m_context || m_recycledMailboxes.isEmpty()) 247 if (m_recycledMailboxes.isEmpty())
246 return PassRefPtr<MailboxInfo>(); 248 return PassRefPtr<MailboxInfo>();
247 249
248 RefPtr<MailboxInfo> mailboxInfo = m_recycledMailboxes.last().release(); 250 RefPtr<MailboxInfo> mailboxInfo = m_recycledMailboxes.last().release();
249 m_recycledMailboxes.removeLast(); 251 m_recycledMailboxes.removeLast();
250 252
251 if (mailboxInfo->mailbox.syncPoint) { 253 if (mailboxInfo->mailbox.syncPoint) {
252 m_context->waitSyncPoint(mailboxInfo->mailbox.syncPoint); 254 m_context->waitSyncPoint(mailboxInfo->mailbox.syncPoint);
253 mailboxInfo->mailbox.syncPoint = 0; 255 mailboxInfo->mailbox.syncPoint = 0;
254 } 256 }
255 257
256 if (mailboxInfo->size != m_size) { 258 if (mailboxInfo->size != m_size) {
257 m_context->bindTexture(GL_TEXTURE_2D, mailboxInfo->textureId); 259 m_context->bindTexture(GL_TEXTURE_2D, mailboxInfo->textureId);
258 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, m_size.w idth(), m_size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE); 260 texImage2DResourceSafe(GL_TEXTURE_2D, 0, m_internalColorFormat, m_size.w idth(), m_size.height(), 0, m_colorFormat, GL_UNSIGNED_BYTE);
259 mailboxInfo->size = m_size; 261 mailboxInfo->size = m_size;
260 } 262 }
261 263
262 return mailboxInfo.release(); 264 return mailboxInfo.release();
263 } 265 }
264 266
265 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox(unsigned textureId) 267 PassRefPtr<DrawingBuffer::MailboxInfo> DrawingBuffer::createNewMailbox(unsigned textureId)
266 { 268 {
267 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo()); 269 RefPtr<MailboxInfo> returnMailbox = adoptRef(new MailboxInfo());
268 m_context->genMailboxCHROMIUM(returnMailbox->mailbox.name); 270 m_context->genMailboxCHROMIUM(returnMailbox->mailbox.name);
269 returnMailbox->textureId = textureId; 271 returnMailbox->textureId = textureId;
270 returnMailbox->size = m_size; 272 returnMailbox->size = m_size;
271 m_textureMailboxes.append(returnMailbox); 273 m_textureMailboxes.append(returnMailbox);
272 return returnMailbox.release(); 274 return returnMailbox.release();
273 } 275 }
274 276
275 void DrawingBuffer::initialize(const IntSize& size) 277 bool DrawingBuffer::initialize(const IntSize& size)
276 { 278 {
277 ASSERT(m_context);
278 m_attributes = m_context->getContextAttributes(); 279 m_attributes = m_context->getContextAttributes();
279 280
280 if (m_attributes.alpha) { 281 if (m_attributes.alpha) {
281 m_internalColorFormat = GL_RGBA; 282 m_internalColorFormat = GL_RGBA;
282 m_colorFormat = GL_RGBA; 283 m_colorFormat = GL_RGBA;
283 m_internalRenderbufferFormat = GL_RGBA8_OES; 284 m_internalRenderbufferFormat = GL_RGBA8_OES;
284 } else { 285 } else {
285 m_internalColorFormat = GL_RGB; 286 m_internalColorFormat = GL_RGB;
286 m_colorFormat = GL_RGB; 287 m_colorFormat = GL_RGB;
287 m_internalRenderbufferFormat = GL_RGB8_OES; 288 m_internalRenderbufferFormat = GL_RGB8_OES;
288 } 289 }
289 290
290 m_context->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize); 291 m_context->getIntegerv(GL_MAX_TEXTURE_SIZE, &m_maxTextureSize);
291 292
292 int maxSampleCount = 0; 293 int maxSampleCount = 0;
293 if (multisample()) 294 if (multisample())
294 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount); 295 m_context->getIntegerv(GL_MAX_SAMPLES_ANGLE, &maxSampleCount);
295 m_sampleCount = std::min(4, maxSampleCount); 296 m_sampleCount = std::min(4, maxSampleCount);
296 297
297 m_fbo = m_context->createFramebuffer(); 298 m_fbo = m_context->createFramebuffer();
298 299
299 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 300 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
300 m_colorBuffer = createColorTexture(); 301 m_colorBuffer = createColorTexture();
301 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEX TURE_2D, m_colorBuffer, 0); 302 m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEX TURE_2D, m_colorBuffer, 0);
302 createSecondaryBuffers(); 303 createSecondaryBuffers();
303 reset(size); 304 return reset(size);
304 } 305 }
305 306
306 bool DrawingBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, b ool premultiplyAlpha, bool flipY) 307 bool DrawingBuffer::copyToPlatformTexture(blink::WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum destType, GLint level, b ool premultiplyAlpha, bool flipY)
307 { 308 {
308 if (!m_context || !m_context->makeContextCurrent()) 309 if (!m_context->makeContextCurrent())
309 return false; 310 return false;
310 if (m_contentsChanged) { 311 if (m_contentsChanged) {
311 if (multisample()) { 312 if (multisample()) {
312 commit(); 313 commit();
313 if (!m_framebufferBinding) 314 if (!m_framebufferBinding)
314 bind(); 315 bind();
315 else 316 else
316 restoreFramebufferBinding(); 317 restoreFramebufferBinding();
317 } 318 }
318 m_context->flush(); 319 m_context->flush();
(...skipping 25 matching lines...) Expand all
344 return true; 345 return true;
345 } 346 }
346 347
347 Platform3DObject DrawingBuffer::framebuffer() const 348 Platform3DObject DrawingBuffer::framebuffer() const
348 { 349 {
349 return m_fbo; 350 return m_fbo;
350 } 351 }
351 352
352 blink::WebLayer* DrawingBuffer::platformLayer() 353 blink::WebLayer* DrawingBuffer::platformLayer()
353 { 354 {
354 if (!m_context)
355 return 0;
356
357 if (!m_layer) { 355 if (!m_layer) {
358 m_layer = adoptPtr(blink::Platform::current()->compositorSupport()->crea teExternalTextureLayer(this)); 356 m_layer = adoptPtr(blink::Platform::current()->compositorSupport()->crea teExternalTextureLayer(this));
359 357
360 m_layer->setOpaque(!m_attributes.alpha); 358 m_layer->setOpaque(!m_attributes.alpha);
361 m_layer->setBlendBackgroundColor(m_attributes.alpha); 359 m_layer->setBlendBackgroundColor(m_attributes.alpha);
362 m_layer->setPremultipliedAlpha(m_attributes.premultipliedAlpha); 360 m_layer->setPremultipliedAlpha(m_attributes.premultipliedAlpha);
363 GraphicsLayer::registerContentsLayer(m_layer->layer()); 361 GraphicsLayer::registerContentsLayer(m_layer->layer());
364 } 362 }
365 363
366 return m_layer->layer(); 364 return m_layer->layer();
367 } 365 }
368 366
369 void DrawingBuffer::paintCompositedResultsToCanvas(ImageBuffer* imageBuffer) 367 void DrawingBuffer::paintCompositedResultsToCanvas(ImageBuffer* imageBuffer)
370 { 368 {
371 if (!m_context || !m_context->makeContextCurrent() || m_context->getGraphics ResetStatusARB() != GL_NO_ERROR) 369 if (!m_context->makeContextCurrent() || m_context->getGraphicsResetStatusARB () != GL_NO_ERROR)
372 return; 370 return;
373 371
374 if (!imageBuffer) 372 if (!imageBuffer)
375 return; 373 return;
376 Platform3DObject tex = imageBuffer->getBackingTexture(); 374 Platform3DObject tex = imageBuffer->getBackingTexture();
377 if (tex) { 375 if (tex) {
378 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_frontColorBuffer, 376 m_context->copyTextureCHROMIUM(GL_TEXTURE_2D, m_frontColorBuffer,
379 tex, 0, GL_RGBA, GL_UNSIGNED_BYTE); 377 tex, 0, GL_RGBA, GL_UNSIGNED_BYTE);
380 return; 378 return;
381 } 379 }
(...skipping 20 matching lines...) Expand all
402 m_context->deleteTexture(sourceTexture); 400 m_context->deleteTexture(sourceTexture);
403 401
404 m_context->bindFramebuffer(GL_FRAMEBUFFER, previousFramebuffer); 402 m_context->bindFramebuffer(GL_FRAMEBUFFER, previousFramebuffer);
405 } 403 }
406 404
407 void DrawingBuffer::clearPlatformLayer() 405 void DrawingBuffer::clearPlatformLayer()
408 { 406 {
409 if (m_layer) 407 if (m_layer)
410 m_layer->clearTexture(); 408 m_layer->clearTexture();
411 409
412 if (m_context) 410 m_context->flush();
413 m_context->flush();
414 } 411 }
415 412
416 void DrawingBuffer::releaseResources() 413 void DrawingBuffer::releaseResources()
417 { 414 {
418 if (m_context) { 415 m_context->makeContextCurrent();
419 m_context->makeContextCurrent();
420 416
421 clearPlatformLayer(); 417 clearPlatformLayer();
422 418
423 for (size_t i = 0; i < m_textureMailboxes.size(); i++) 419 for (size_t i = 0; i < m_textureMailboxes.size(); i++)
424 m_context->deleteTexture(m_textureMailboxes[i]->textureId); 420 m_context->deleteTexture(m_textureMailboxes[i]->textureId);
425 421
426 if (m_multisampleColorBuffer) 422 if (m_multisampleColorBuffer)
427 m_context->deleteRenderbuffer(m_multisampleColorBuffer); 423 m_context->deleteRenderbuffer(m_multisampleColorBuffer);
428 424
429 if (m_depthStencilBuffer) 425 if (m_depthStencilBuffer)
430 m_context->deleteRenderbuffer(m_depthStencilBuffer); 426 m_context->deleteRenderbuffer(m_depthStencilBuffer);
431 427
432 if (m_depthBuffer) 428 if (m_depthBuffer)
433 m_context->deleteRenderbuffer(m_depthBuffer); 429 m_context->deleteRenderbuffer(m_depthBuffer);
434 430
435 if (m_stencilBuffer) 431 if (m_stencilBuffer)
436 m_context->deleteRenderbuffer(m_stencilBuffer); 432 m_context->deleteRenderbuffer(m_stencilBuffer);
437 433
438 if (m_multisampleFBO) 434 if (m_multisampleFBO)
439 m_context->deleteFramebuffer(m_multisampleFBO); 435 m_context->deleteFramebuffer(m_multisampleFBO);
440 436
441 if (m_fbo) 437 if (m_fbo)
442 m_context->deleteFramebuffer(m_fbo); 438 m_context->deleteFramebuffer(m_fbo);
443 439
444 m_context = 0; 440 m_context.clear();
445 }
446 441
447 setSize(IntSize()); 442 setSize(IntSize());
448 443
449 m_colorBuffer = 0; 444 m_colorBuffer = 0;
450 m_frontColorBuffer = 0; 445 m_frontColorBuffer = 0;
451 m_multisampleColorBuffer = 0; 446 m_multisampleColorBuffer = 0;
452 m_depthStencilBuffer = 0; 447 m_depthStencilBuffer = 0;
453 m_depthBuffer = 0; 448 m_depthBuffer = 0;
454 m_stencilBuffer = 0; 449 m_stencilBuffer = 0;
455 m_multisampleFBO = 0; 450 m_multisampleFBO = 0;
456 m_fbo = 0; 451 m_fbo = 0;
457 m_contextEvictionManager.clear(); 452 m_contextEvictionManager.clear();
458 453
459 m_recycledMailboxes.clear(); 454 m_recycledMailboxes.clear();
460 m_textureMailboxes.clear(); 455 m_textureMailboxes.clear();
461 456
462 if (m_layer) { 457 if (m_layer) {
463 GraphicsLayer::unregisterContentsLayer(m_layer->layer()); 458 GraphicsLayer::unregisterContentsLayer(m_layer->layer());
464 m_layer.clear(); 459 m_layer.clear();
465 } 460 }
466 } 461 }
467 462
468 unsigned DrawingBuffer::createColorTexture(const IntSize& size) 463 unsigned DrawingBuffer::createColorTexture(const IntSize& size)
469 { 464 {
470 if (!m_context)
471 return 0;
472
473 unsigned offscreenColorTexture = m_context->createTexture(); 465 unsigned offscreenColorTexture = m_context->createTexture();
474 if (!offscreenColorTexture) 466 if (!offscreenColorTexture)
475 return 0; 467 return 0;
476 468
477 m_context->bindTexture(GL_TEXTURE_2D, offscreenColorTexture); 469 m_context->bindTexture(GL_TEXTURE_2D, offscreenColorTexture);
478 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 470 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
479 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 471 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
480 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ; 472 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) ;
481 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) ; 473 m_context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) ;
482 if (!size.isEmpty()) 474 if (!size.isEmpty())
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 m_context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACH MENT, GL_RENDERBUFFER, m_stencilBuffer); 562 m_context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACH MENT, GL_RENDERBUFFER, m_stencilBuffer);
571 } 563 }
572 } 564 }
573 m_context->bindRenderbuffer(GL_RENDERBUFFER, 0); 565 m_context->bindRenderbuffer(GL_RENDERBUFFER, 0);
574 } 566 }
575 567
576 568
577 569
578 void DrawingBuffer::clearFramebuffers(GLbitfield clearMask) 570 void DrawingBuffer::clearFramebuffers(GLbitfield clearMask)
579 { 571 {
580 if (!m_context)
581 return;
582
583 // We will clear the multisample FBO, but we also need to clear the non-mult isampled buffer too. 572 // We will clear the multisample FBO, but we also need to clear the non-mult isampled buffer too.
584 if (m_multisampleFBO) { 573 if (m_multisampleFBO) {
585 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 574 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
586 m_context->clear(GL_COLOR_BUFFER_BIT); 575 m_context->clear(GL_COLOR_BUFFER_BIT);
587 } 576 }
588 577
589 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleF BO : m_fbo); 578 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleF BO : m_fbo);
590 m_context->clear(clearMask); 579 m_context->clear(clearMask);
591 } 580 }
592 581
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 int pixelDelta = oldestSize.width() * oldestSize.height(); 629 int pixelDelta = oldestSize.width() * oldestSize.height();
641 630
642 s_currentResourceUsePixels -= pixelDelta; 631 s_currentResourceUsePixels -= pixelDelta;
643 adjustedSize = adjustSize(size); 632 adjustedSize = adjustSize(size);
644 s_currentResourceUsePixels += pixelDelta; 633 s_currentResourceUsePixels += pixelDelta;
645 634
646 evictContext = !adjustedSize.isEmpty(); 635 evictContext = !adjustedSize.isEmpty();
647 return adjustedSize; 636 return adjustedSize;
648 } 637 }
649 638
650 void DrawingBuffer::reset(const IntSize& newSize) 639 bool DrawingBuffer::reset(const IntSize& newSize)
651 { 640 {
652 if (!m_context) 641 ASSERT(!newSize.isEmpty());
653 return;
654
655 IntSize adjustedSize; 642 IntSize adjustedSize;
656 bool evictContext = false; 643 bool evictContext = false;
657 bool isNewContext = m_size.isEmpty(); 644 bool isNewContext = m_size.isEmpty();
658 if (s_allowContextEvictionOnCreate && isNewContext) 645 if (s_allowContextEvictionOnCreate && isNewContext)
659 adjustedSize = adjustSizeWithContextEviction(newSize, evictContext); 646 adjustedSize = adjustSizeWithContextEviction(newSize, evictContext);
660 else 647 else
661 adjustedSize = adjustSize(newSize); 648 adjustedSize = adjustSize(newSize);
662 649
663 if (adjustedSize.isEmpty()) 650 if (adjustedSize.isEmpty())
664 return; 651 return false;
665 652
666 if (evictContext) 653 if (evictContext)
667 m_contextEvictionManager->forciblyLoseOldestContext("WARNING: WebGL cont exts have exceeded the maximum allowed backbuffer area. Oldest context will be l ost."); 654 m_contextEvictionManager->forciblyLoseOldestContext("WARNING: WebGL cont exts have exceeded the maximum allowed backbuffer area. Oldest context will be l ost.");
668 655
669 if (adjustedSize != m_size) { 656 if (adjustedSize != m_size) {
670 do { 657 do {
671 // resize multisample FBO 658 // resize multisample FBO
672 if (!resizeMultisampleFramebuffer(adjustedSize) || !resizeFramebuffe r(adjustedSize)) { 659 if (!resizeMultisampleFramebuffer(adjustedSize) || !resizeFramebuffe r(adjustedSize)) {
673 adjustedSize.scale(s_resourceAdjustedRatio); 660 adjustedSize.scale(s_resourceAdjustedRatio);
674 continue; 661 continue;
675 } 662 }
676 break; 663 break;
677 } while (!adjustedSize.isEmpty()); 664 } while (!adjustedSize.isEmpty());
678 665
679 setSize(adjustedSize); 666 setSize(adjustedSize);
680 667
681 if (adjustedSize.isEmpty()) 668 if (adjustedSize.isEmpty())
682 return; 669 return false;
683 } 670 }
684 671
685 m_context->disable(GL_SCISSOR_TEST); 672 m_context->disable(GL_SCISSOR_TEST);
686 m_context->clearColor(0, 0, 0, 0); 673 m_context->clearColor(0, 0, 0, 0);
687 m_context->colorMask(true, true, true, true); 674 m_context->colorMask(true, true, true, true);
688 675
689 GLbitfield clearMask = GL_COLOR_BUFFER_BIT; 676 GLbitfield clearMask = GL_COLOR_BUFFER_BIT;
690 if (m_attributes.depth) { 677 if (m_attributes.depth) {
691 m_context->clearDepth(1.0f); 678 m_context->clearDepth(1.0f);
692 clearMask |= GL_DEPTH_BUFFER_BIT; 679 clearMask |= GL_DEPTH_BUFFER_BIT;
693 m_context->depthMask(true); 680 m_context->depthMask(true);
694 } 681 }
695 if (m_attributes.stencil) { 682 if (m_attributes.stencil) {
696 m_context->clearStencil(0); 683 m_context->clearStencil(0);
697 clearMask |= GL_STENCIL_BUFFER_BIT; 684 clearMask |= GL_STENCIL_BUFFER_BIT;
698 m_context->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF); 685 m_context->stencilMaskSeparate(GL_FRONT, 0xFFFFFFFF);
699 } 686 }
700 687
701 clearFramebuffers(clearMask); 688 clearFramebuffers(clearMask);
689 return true;
702 } 690 }
703 691
704 void DrawingBuffer::commit(long x, long y, long width, long height) 692 void DrawingBuffer::commit(long x, long y, long width, long height)
705 { 693 {
706 if (!m_context)
707 return;
708
709 if (width < 0) 694 if (width < 0)
710 width = m_size.width(); 695 width = m_size.width();
711 if (height < 0) 696 if (height < 0)
712 height = m_size.height(); 697 height = m_size.height();
713 698
714 m_context->makeContextCurrent(); 699 m_context->makeContextCurrent();
715 700
716 if (m_multisampleFBO && !m_contentsChangeCommitted) { 701 if (m_multisampleFBO && !m_contentsChangeCommitted) {
717 m_context->bindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, m_multisampleFBO); 702 m_context->bindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, m_multisampleFBO);
718 m_context->bindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, m_fbo); 703 m_context->bindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, m_fbo);
719 704
720 if (m_scissorEnabled) 705 if (m_scissorEnabled)
721 m_context->disable(GL_SCISSOR_TEST); 706 m_context->disable(GL_SCISSOR_TEST);
722 707
723 // Use NEAREST, because there is no scale performed during the blit. 708 // Use NEAREST, because there is no scale performed during the blit.
724 m_context->blitFramebufferCHROMIUM(x, y, width, height, x, y, width, hei ght, GL_COLOR_BUFFER_BIT, GL_NEAREST); 709 m_context->blitFramebufferCHROMIUM(x, y, width, height, x, y, width, hei ght, GL_COLOR_BUFFER_BIT, GL_NEAREST);
725 710
726 if (m_scissorEnabled) 711 if (m_scissorEnabled)
727 m_context->enable(GL_SCISSOR_TEST); 712 m_context->enable(GL_SCISSOR_TEST);
728 } 713 }
729 714
730 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo); 715 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_fbo);
731 m_contentsChangeCommitted = true; 716 m_contentsChangeCommitted = true;
732 } 717 }
733 718
734 void DrawingBuffer::restoreFramebufferBinding() 719 void DrawingBuffer::restoreFramebufferBinding()
735 { 720 {
736 if (!m_context || !m_framebufferBinding) 721 if (!m_framebufferBinding)
737 return; 722 return;
738 723
739 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding); 724 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebufferBinding);
740 } 725 }
741 726
742 bool DrawingBuffer::multisample() const 727 bool DrawingBuffer::multisample() const
743 { 728 {
744 return m_attributes.antialias && m_multisampleExtensionSupported; 729 return m_attributes.antialias && m_multisampleExtensionSupported;
745 } 730 }
746 731
747 void DrawingBuffer::bind() 732 void DrawingBuffer::bind()
748 { 733 {
749 if (!m_context)
750 return;
751
752 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleF BO : m_fbo); 734 m_context->bindFramebuffer(GL_FRAMEBUFFER, m_multisampleFBO ? m_multisampleF BO : m_fbo);
753 } 735 }
754 736
755 void DrawingBuffer::setPackAlignment(GLint param) 737 void DrawingBuffer::setPackAlignment(GLint param)
756 { 738 {
757 m_packAlignment = param; 739 m_packAlignment = param;
758 } 740 }
759 741
760 void DrawingBuffer::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer) 742 void DrawingBuffer::paintRenderingResultsToCanvas(ImageBuffer* imageBuffer)
761 { 743 {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 } 855 }
874 } 856 }
875 857
876 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint unpackAlignment) 858 void DrawingBuffer::texImage2DResourceSafe(GLenum target, GLint level, GLenum in ternalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint unpackAlignment)
877 { 859 {
878 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4 || unpackAlignment == 8); 860 ASSERT(unpackAlignment == 1 || unpackAlignment == 2 || unpackAlignment == 4 || unpackAlignment == 8);
879 m_context->texImage2D(target, level, internalformat, width, height, border, format, type, 0); 861 m_context->texImage2D(target, level, internalformat, width, height, border, format, type, 0);
880 } 862 }
881 863
882 } // namespace WebCore 864 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698