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

Side by Side Diff: Source/core/html/canvas/WebGLFramebuffer.cpp

Issue 106503003: Changed GL enums from GraphicsContext3D to standard versions (Take 2) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/html/canvas/WebGLDrawBuffers.cpp ('k') | Source/core/html/canvas/WebGLObject.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2009 Apple 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 80 }
81 81
82 GC3Dsizei WebGLRenderbufferAttachment::height() const 82 GC3Dsizei WebGLRenderbufferAttachment::height() const
83 { 83 {
84 return m_renderbuffer->height(); 84 return m_renderbuffer->height();
85 } 85 }
86 86
87 GC3Denum WebGLRenderbufferAttachment::format() const 87 GC3Denum WebGLRenderbufferAttachment::format() const
88 { 88 {
89 GC3Denum format = m_renderbuffer->internalFormat(); 89 GC3Denum format = m_renderbuffer->internalFormat();
90 if (format == GraphicsContext3D::DEPTH_STENCIL 90 if (format == GL_DEPTH_STENCIL_OES
91 && m_renderbuffer->emulatedStencilBuffer() 91 && m_renderbuffer->emulatedStencilBuffer()
92 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != Grap hicsContext3D::STENCIL_INDEX8) { 92 && m_renderbuffer->emulatedStencilBuffer()->internalFormat() != GL_S TENCIL_INDEX8) {
93 return 0; 93 return 0;
94 } 94 }
95 return format; 95 return format;
96 } 96 }
97 97
98 WebGLSharedObject* WebGLRenderbufferAttachment::object() const 98 WebGLSharedObject* WebGLRenderbufferAttachment::object() const
99 { 99 {
100 return m_renderbuffer->object() ? m_renderbuffer.get() : 0; 100 return m_renderbuffer->object() ? m_renderbuffer.get() : 0;
101 } 101 }
102 102
(...skipping 19 matching lines...) Expand all
122 } 122 }
123 123
124 void WebGLRenderbufferAttachment::onDetached(GraphicsContext3D* context) 124 void WebGLRenderbufferAttachment::onDetached(GraphicsContext3D* context)
125 { 125 {
126 m_renderbuffer->onDetached(context); 126 m_renderbuffer->onDetached(context);
127 } 127 }
128 128
129 void WebGLRenderbufferAttachment::attach(GraphicsContext3D* context, GC3Denu m attachment) 129 void WebGLRenderbufferAttachment::attach(GraphicsContext3D* context, GC3Denu m attachment)
130 { 130 {
131 Platform3DObject object = objectOrZero(m_renderbuffer.get()); 131 Platform3DObject object = objectOrZero(m_renderbuffer.get());
132 if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT && m_rende rbuffer->emulatedStencilBuffer()) { 132 if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL && m_renderbuffer- >emulatedStencilBuffer()) {
133 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, Gra phicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, object); 133 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, object);
134 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, Gra phicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, objectOrZer o(m_renderbuffer->emulatedStencilBuffer())); 134 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHME NT, GL_RENDERBUFFER, objectOrZero(m_renderbuffer->emulatedStencilBuffer()));
135 } else { 135 } else {
136 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, att achment, GraphicsContext3D::RENDERBUFFER, object); 136 context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_REND ERBUFFER, object);
137 } 137 }
138 } 138 }
139 139
140 void WebGLRenderbufferAttachment::unattach(GraphicsContext3D* context, GC3De num attachment) 140 void WebGLRenderbufferAttachment::unattach(GraphicsContext3D* context, GC3De num attachment)
141 { 141 {
142 if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { 142 if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL) {
143 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, Gra phicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, 0); 143 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, 0);
144 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, Gra phicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::RENDERBUFFER, 0); 144 context->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHME NT, GL_RENDERBUFFER, 0);
145 } else 145 } else {
146 context->framebufferRenderbuffer(GraphicsContext3D::FRAMEBUFFER, att achment, GraphicsContext3D::RENDERBUFFER, 0); 146 context->framebufferRenderbuffer(GL_FRAMEBUFFER, attachment, GL_REND ERBUFFER, 0);
147 }
147 } 148 }
148 149
149 GC3Denum WebGLRenderbufferAttachment::type() const 150 GC3Denum WebGLRenderbufferAttachment::type() const
150 { 151 {
151 notImplemented(); 152 notImplemented();
152 return 0; 153 return 0;
153 } 154 }
154 155
155 class WebGLTextureAttachment : public WebGLFramebuffer::WebGLAttachment { 156 class WebGLTextureAttachment : public WebGLFramebuffer::WebGLAttachment {
156 public: 157 public:
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 } 233 }
233 234
234 void WebGLTextureAttachment::onDetached(GraphicsContext3D* context) 235 void WebGLTextureAttachment::onDetached(GraphicsContext3D* context)
235 { 236 {
236 m_texture->onDetached(context); 237 m_texture->onDetached(context);
237 } 238 }
238 239
239 void WebGLTextureAttachment::attach(GraphicsContext3D* context, GC3Denum att achment) 240 void WebGLTextureAttachment::attach(GraphicsContext3D* context, GC3Denum att achment)
240 { 241 {
241 Platform3DObject object = objectOrZero(m_texture.get()); 242 Platform3DObject object = objectOrZero(m_texture.get());
242 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, attachment , m_target, object, m_level); 243 context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, obje ct, m_level);
243 } 244 }
244 245
245 void WebGLTextureAttachment::unattach(GraphicsContext3D* context, GC3Denum a ttachment) 246 void WebGLTextureAttachment::unattach(GraphicsContext3D* context, GC3Denum a ttachment)
246 { 247 {
247 if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { 248 if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL) {
248 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, Graphi csContext3D::DEPTH_ATTACHMENT, m_target, 0, m_level); 249 context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m _target, 0, m_level);
249 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, Graphi csContext3D::STENCIL_ATTACHMENT, m_target, 0, m_level); 250 context->framebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, m_target, 0, m_level);
250 } else 251 } else {
251 context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, attach ment, m_target, 0, m_level); 252 context->framebufferTexture2D(GL_FRAMEBUFFER, attachment, m_target, 0, m_level);
253 }
252 } 254 }
253 255
254 GC3Denum WebGLTextureAttachment::type() const 256 GC3Denum WebGLTextureAttachment::type() const
255 { 257 {
256 return m_texture->getType(m_target, m_level); 258 return m_texture->getType(m_target, m_level);
257 } 259 }
258 260
259 bool isColorRenderable(GC3Denum internalformat) 261 bool isColorRenderable(GC3Denum internalformat)
260 { 262 {
261 switch (internalformat) { 263 switch (internalformat) {
262 case GraphicsContext3D::RGBA4: 264 case GL_RGBA4:
263 case GraphicsContext3D::RGB5_A1: 265 case GL_RGB5_A1:
264 case GraphicsContext3D::RGB565: 266 case GL_RGB565:
265 return true; 267 return true;
266 default: 268 default:
267 return false; 269 return false;
268 } 270 }
269 } 271 }
270 272
271 } // anonymous namespace 273 } // anonymous namespace
272 274
273 WebGLFramebuffer::WebGLAttachment::WebGLAttachment() 275 WebGLFramebuffer::WebGLAttachment::WebGLAttachment()
274 { 276 {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 342
341 bool WebGLFramebuffer::isAttachmentComplete(WebGLAttachment* attachedObject, GC3 Denum attachment, const char** reason) const 343 bool WebGLFramebuffer::isAttachmentComplete(WebGLAttachment* attachedObject, GC3 Denum attachment, const char** reason) const
342 { 344 {
343 ASSERT(attachedObject && attachedObject->valid()); 345 ASSERT(attachedObject && attachedObject->valid());
344 ASSERT(reason); 346 ASSERT(reason);
345 347
346 GC3Denum internalformat = attachedObject->format(); 348 GC3Denum internalformat = attachedObject->format();
347 WebGLSharedObject* object = attachedObject->object(); 349 WebGLSharedObject* object = attachedObject->object();
348 ASSERT(object && (object->isTexture() || object->isRenderbuffer())); 350 ASSERT(object && (object->isTexture() || object->isRenderbuffer()));
349 351
350 if (attachment == GraphicsContext3D::DEPTH_ATTACHMENT) { 352 if (attachment == GL_DEPTH_ATTACHMENT) {
351 if (object->isRenderbuffer()) { 353 if (object->isRenderbuffer()) {
352 if (internalformat != GraphicsContext3D::DEPTH_COMPONENT16) { 354 if (internalformat != GL_DEPTH_COMPONENT16) {
353 *reason = "the internalformat of the attached renderbuffer is no t DEPTH_COMPONENT16"; 355 *reason = "the internalformat of the attached renderbuffer is no t DEPTH_COMPONENT16";
354 return false; 356 return false;
355 } 357 }
356 } else if (object->isTexture()) { 358 } else if (object->isTexture()) {
357 GC3Denum type = attachedObject->type(); 359 GC3Denum type = attachedObject->type();
358 if (!(context()->m_webglDepthTexture && internalformat == GraphicsCo ntext3D::DEPTH_COMPONENT 360 if (!(context()->m_webglDepthTexture && internalformat == GL_DEPTH_C OMPONENT
359 && (type == GraphicsContext3D::UNSIGNED_SHORT || type == Graphic sContext3D::UNSIGNED_INT))) { 361 && (type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT))) {
360 *reason = "the attached texture is not a depth texture"; 362 *reason = "the attached texture is not a depth texture";
361 return false; 363 return false;
362 } 364 }
363 } 365 }
364 } else if (attachment == GraphicsContext3D::STENCIL_ATTACHMENT) { 366 } else if (attachment == GL_STENCIL_ATTACHMENT) {
365 // Depend on the underlying GL drivers to check stencil textures 367 // Depend on the underlying GL drivers to check stencil textures
366 // and check renderbuffer type here only. 368 // and check renderbuffer type here only.
367 if (object->isRenderbuffer()) { 369 if (object->isRenderbuffer()) {
368 if (internalformat != GraphicsContext3D::STENCIL_INDEX8) { 370 if (internalformat != GL_STENCIL_INDEX8) {
369 *reason = "the internalformat of the attached renderbuffer is no t STENCIL_INDEX8"; 371 *reason = "the internalformat of the attached renderbuffer is no t STENCIL_INDEX8";
370 return false; 372 return false;
371 } 373 }
372 } 374 }
373 } else if (attachment == GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT) { 375 } else if (attachment == GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL) {
374 if (object->isRenderbuffer()) { 376 if (object->isRenderbuffer()) {
375 if (internalformat != GraphicsContext3D::DEPTH_STENCIL) { 377 if (internalformat != GL_DEPTH_STENCIL_OES) {
376 *reason = "the internalformat of the attached renderbuffer is no t DEPTH_STENCIL"; 378 *reason = "the internalformat of the attached renderbuffer is no t DEPTH_STENCIL";
377 return false; 379 return false;
378 } 380 }
379 } else if (object->isTexture()) { 381 } else if (object->isTexture()) {
380 GC3Denum type = attachedObject->type(); 382 GC3Denum type = attachedObject->type();
381 if (!(context()->m_webglDepthTexture && internalformat == GraphicsCo ntext3D::DEPTH_STENCIL 383 if (!(context()->m_webglDepthTexture && internalformat == GL_DEPTH_S TENCIL_OES
382 && type == GraphicsContext3D::UNSIGNED_INT_24_8)) { 384 && type == GL_UNSIGNED_INT_24_8_OES)) {
383 *reason = "the attached texture is not a DEPTH_STENCIL texture"; 385 *reason = "the attached texture is not a DEPTH_STENCIL texture";
384 return false; 386 return false;
385 } 387 }
386 } 388 }
387 } else if (attachment == GraphicsContext3D::COLOR_ATTACHMENT0 389 } else if (attachment == GL_COLOR_ATTACHMENT0
388 || (context()->m_webglDrawBuffers && attachment > GraphicsContext3D::COL OR_ATTACHMENT0 390 || (context()->m_webglDrawBuffers && attachment > GL_COLOR_ATTACHMENT0
389 && attachment < static_cast<GC3Denum>(GraphicsContext3D::COLOR_ATTAC HMENT0 + context()->maxColorAttachments()))) { 391 && attachment < static_cast<GC3Denum>(GL_COLOR_ATTACHMENT0 + context ()->maxColorAttachments()))) {
390 if (object->isRenderbuffer()) { 392 if (object->isRenderbuffer()) {
391 if (!isColorRenderable(internalformat)) { 393 if (!isColorRenderable(internalformat)) {
392 *reason = "the internalformat of the attached renderbuffer is no t color-renderable"; 394 *reason = "the internalformat of the attached renderbuffer is no t color-renderable";
393 return false; 395 return false;
394 } 396 }
395 } else if (object->isTexture()) { 397 } else if (object->isTexture()) {
396 GC3Denum type = attachedObject->type(); 398 GC3Denum type = attachedObject->type();
397 if (internalformat != GraphicsContext3D::RGBA && internalformat != G raphicsContext3D::RGB) { 399 if (internalformat != GL_RGBA && internalformat != GL_RGB) {
398 *reason = "the internalformat of the attached texture is not col or-renderable"; 400 *reason = "the internalformat of the attached texture is not col or-renderable";
399 return false; 401 return false;
400 } 402 }
401 // TODO: WEBGL_color_buffer_float and EXT_color_buffer_half_float ex tensions have not been implemented in 403 // TODO: WEBGL_color_buffer_float and EXT_color_buffer_half_float ex tensions have not been implemented in
402 // WebGL yet. It would be better to depend on the underlying GL driv ers to check on rendering to floating point textures 404 // WebGL yet. It would be better to depend on the underlying GL driv ers to check on rendering to floating point textures
403 // and add the check back to WebGL when above two extensions are imp lemented. 405 // and add the check back to WebGL when above two extensions are imp lemented.
404 // Assume UNSIGNED_BYTE is renderable here without the need to expli citly check if GL_OES_rgb8_rgba8 extension is supported. 406 // Assume UNSIGNED_BYTE is renderable here without the need to expli citly check if GL_OES_rgb8_rgba8 extension is supported.
405 if (type != GraphicsContext3D::UNSIGNED_BYTE 407 if (type != GL_UNSIGNED_BYTE
406 && type != GraphicsContext3D::UNSIGNED_SHORT_5_6_5 408 && type != GL_UNSIGNED_SHORT_5_6_5
407 && type != GraphicsContext3D::UNSIGNED_SHORT_4_4_4_4 409 && type != GL_UNSIGNED_SHORT_4_4_4_4
408 && type != GraphicsContext3D::UNSIGNED_SHORT_5_5_5_1 410 && type != GL_UNSIGNED_SHORT_5_5_5_1
409 && !(type == GraphicsContext3D::FLOAT && context()->m_oesTexture Float) 411 && !(type == GL_FLOAT && context()->m_oesTextureFloat)
410 && !(type == GraphicsContext3D::HALF_FLOAT_OES && context()->m_o esTextureHalfFloat)) { 412 && !(type == GL_HALF_FLOAT_OES && context()->m_oesTextureHalfFlo at)) {
411 *reason = "unsupported type: The attached texture is not support ed to be rendered to"; 413 *reason = "unsupported type: The attached texture is not support ed to be rendered to";
412 return false; 414 return false;
413 } 415 }
414 } 416 }
415 } else { 417 } else {
416 *reason = "unknown framebuffer attachment point"; 418 *reason = "unknown framebuffer attachment point";
417 return false; 419 return false;
418 } 420 }
419 421
420 if (!attachedObject->width() || !attachedObject->height()) { 422 if (!attachedObject->width() || !attachedObject->height()) {
(...skipping 14 matching lines...) Expand all
435 ASSERT(isBound()); 437 ASSERT(isBound());
436 if (!object()) 438 if (!object())
437 return; 439 return;
438 440
439 WebGLAttachment* attachmentObject = getAttachment(attachment); 441 WebGLAttachment* attachmentObject = getAttachment(attachment);
440 if (attachmentObject) { 442 if (attachmentObject) {
441 attachmentObject->onDetached(context()->graphicsContext3D()); 443 attachmentObject->onDetached(context()->graphicsContext3D());
442 m_attachments.remove(attachment); 444 m_attachments.remove(attachment);
443 drawBuffersIfNecessary(false); 445 drawBuffersIfNecessary(false);
444 switch (attachment) { 446 switch (attachment) {
445 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: 447 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
446 attach(GraphicsContext3D::DEPTH_ATTACHMENT, GraphicsContext3D::DEPTH _ATTACHMENT); 448 attach(GL_DEPTH_ATTACHMENT, GL_DEPTH_ATTACHMENT);
447 attach(GraphicsContext3D::STENCIL_ATTACHMENT, GraphicsContext3D::STE NCIL_ATTACHMENT); 449 attach(GL_STENCIL_ATTACHMENT, GL_STENCIL_ATTACHMENT);
448 break; 450 break;
449 case GraphicsContext3D::DEPTH_ATTACHMENT: 451 case GL_DEPTH_ATTACHMENT:
450 attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT, GraphicsContext3 D::DEPTH_ATTACHMENT); 452 attach(GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL, GL_DEPTH_ATTACHMENT);
451 break; 453 break;
452 case GraphicsContext3D::STENCIL_ATTACHMENT: 454 case GL_STENCIL_ATTACHMENT:
453 attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT, GraphicsContext3 D::STENCIL_ATTACHMENT); 455 attach(GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL, GL_STENCIL_ATTACHMENT);
454 break; 456 break;
455 } 457 }
456 } 458 }
457 } 459 }
458 460
459 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(WebGLSharedObject* a ttachment) 461 void WebGLFramebuffer::removeAttachmentFromBoundFramebuffer(WebGLSharedObject* a ttachment)
460 { 462 {
461 ASSERT(isBound()); 463 ASSERT(isBound());
462 if (!object()) 464 if (!object())
463 return; 465 return;
(...skipping 13 matching lines...) Expand all
477 break; 479 break;
478 } 480 }
479 } 481 }
480 } 482 }
481 } 483 }
482 484
483 GC3Dsizei WebGLFramebuffer::colorBufferWidth() const 485 GC3Dsizei WebGLFramebuffer::colorBufferWidth() const
484 { 486 {
485 if (!object()) 487 if (!object())
486 return 0; 488 return 0;
487 WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHM ENT0); 489 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0);
488 if (!attachment) 490 if (!attachment)
489 return 0; 491 return 0;
490 492
491 return attachment->width(); 493 return attachment->width();
492 } 494 }
493 495
494 GC3Dsizei WebGLFramebuffer::colorBufferHeight() const 496 GC3Dsizei WebGLFramebuffer::colorBufferHeight() const
495 { 497 {
496 if (!object()) 498 if (!object())
497 return 0; 499 return 0;
498 WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHM ENT0); 500 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0);
499 if (!attachment) 501 if (!attachment)
500 return 0; 502 return 0;
501 503
502 return attachment->height(); 504 return attachment->height();
503 } 505 }
504 506
505 GC3Denum WebGLFramebuffer::colorBufferFormat() const 507 GC3Denum WebGLFramebuffer::colorBufferFormat() const
506 { 508 {
507 if (!object()) 509 if (!object())
508 return 0; 510 return 0;
509 WebGLAttachment* attachment = getAttachment(GraphicsContext3D::COLOR_ATTACHM ENT0); 511 WebGLAttachment* attachment = getAttachment(GL_COLOR_ATTACHMENT0);
510 if (!attachment) 512 if (!attachment)
511 return 0; 513 return 0;
512 return attachment->format(); 514 return attachment->format();
513 } 515 }
514 516
515 GC3Denum WebGLFramebuffer::checkStatus(const char** reason) const 517 GC3Denum WebGLFramebuffer::checkStatus(const char** reason) const
516 { 518 {
517 unsigned int count = 0; 519 unsigned int count = 0;
518 GC3Dsizei width = 0, height = 0; 520 GC3Dsizei width = 0, height = 0;
519 bool haveDepth = false; 521 bool haveDepth = false;
520 bool haveStencil = false; 522 bool haveStencil = false;
521 bool haveDepthStencil = false; 523 bool haveDepthStencil = false;
522 for (AttachmentMap::const_iterator it = m_attachments.begin(); it != m_attac hments.end(); ++it) { 524 for (AttachmentMap::const_iterator it = m_attachments.begin(); it != m_attac hments.end(); ++it) {
523 WebGLAttachment* attachment = it->value.get(); 525 WebGLAttachment* attachment = it->value.get();
524 if (!isAttachmentComplete(attachment, it->key, reason)) 526 if (!isAttachmentComplete(attachment, it->key, reason))
525 return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 527 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
526 if (!attachment->valid()) { 528 if (!attachment->valid()) {
527 *reason = "attachment is not valid"; 529 *reason = "attachment is not valid";
528 return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED; 530 return GL_FRAMEBUFFER_UNSUPPORTED;
529 } 531 }
530 if (!attachment->format()) { 532 if (!attachment->format()) {
531 *reason = "attachment is an unsupported format"; 533 *reason = "attachment is an unsupported format";
532 return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 534 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
533 } 535 }
534 switch (it->key) { 536 switch (it->key) {
535 case GraphicsContext3D::DEPTH_ATTACHMENT: 537 case GL_DEPTH_ATTACHMENT:
536 haveDepth = true; 538 haveDepth = true;
537 break; 539 break;
538 case GraphicsContext3D::STENCIL_ATTACHMENT: 540 case GL_STENCIL_ATTACHMENT:
539 haveStencil = true; 541 haveStencil = true;
540 break; 542 break;
541 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: 543 case GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL:
542 haveDepthStencil = true; 544 haveDepthStencil = true;
543 break; 545 break;
544 } 546 }
545 if (!count) { 547 if (!count) {
546 width = attachment->width(); 548 width = attachment->width();
547 height = attachment->height(); 549 height = attachment->height();
548 } else { 550 } else {
549 if (width != attachment->width() || height != attachment->height()) { 551 if (width != attachment->width() || height != attachment->height()) {
550 *reason = "attachments do not have the same dimensions"; 552 *reason = "attachments do not have the same dimensions";
551 return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_DIMENSIONS; 553 return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
552 } 554 }
553 } 555 }
554 ++count; 556 ++count;
555 } 557 }
556 if (!count) { 558 if (!count) {
557 *reason = "no attachments"; 559 *reason = "no attachments";
558 return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; 560 return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
559 } 561 }
560 if (!width || !height) { 562 if (!width || !height) {
561 *reason = "framebuffer has a 0 dimension"; 563 *reason = "framebuffer has a 0 dimension";
562 return GraphicsContext3D::FRAMEBUFFER_INCOMPLETE_ATTACHMENT; 564 return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
563 } 565 }
564 // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments. 566 // WebGL specific: no conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments.
565 if ((haveDepthStencil && (haveDepth || haveStencil)) || (haveDepth && haveSt encil)) { 567 if ((haveDepthStencil && (haveDepth || haveStencil)) || (haveDepth && haveSt encil)) {
566 *reason = "conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments"; 568 *reason = "conflicting DEPTH/STENCIL/DEPTH_STENCIL attachments";
567 return GraphicsContext3D::FRAMEBUFFER_UNSUPPORTED; 569 return GL_FRAMEBUFFER_UNSUPPORTED;
568 } 570 }
569 return GraphicsContext3D::FRAMEBUFFER_COMPLETE; 571 return GL_FRAMEBUFFER_COMPLETE;
570 } 572 }
571 573
572 bool WebGLFramebuffer::onAccess(GraphicsContext3D* context3d, const char** reaso n) 574 bool WebGLFramebuffer::onAccess(GraphicsContext3D* context3d, const char** reaso n)
573 { 575 {
574 if (checkStatus(reason) != GraphicsContext3D::FRAMEBUFFER_COMPLETE) 576 if (checkStatus(reason) != GL_FRAMEBUFFER_COMPLETE)
575 return false; 577 return false;
576 return true; 578 return true;
577 } 579 }
578 580
579 bool WebGLFramebuffer::hasStencilBuffer() const 581 bool WebGLFramebuffer::hasStencilBuffer() const
580 { 582 {
581 WebGLAttachment* attachment = getAttachment(GraphicsContext3D::STENCIL_ATTAC HMENT); 583 WebGLAttachment* attachment = getAttachment(GL_STENCIL_ATTACHMENT);
582 if (!attachment) 584 if (!attachment)
583 attachment = getAttachment(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT); 585 attachment = getAttachment(GC3D_DEPTH_STENCIL_ATTACHMENT_WEBGL);
584 return attachment && attachment->valid(); 586 return attachment && attachment->valid();
585 } 587 }
586 588
587 void WebGLFramebuffer::deleteObjectImpl(GraphicsContext3D* context3d, Platform3D Object object) 589 void WebGLFramebuffer::deleteObjectImpl(GraphicsContext3D* context3d, Platform3D Object object)
588 { 590 {
589 for (AttachmentMap::iterator it = m_attachments.begin(); it != m_attachments .end(); ++it) 591 for (AttachmentMap::iterator it = m_attachments.begin(); it != m_attachments .end(); ++it)
590 it->value->onDetached(context3d); 592 it->value->onDetached(context3d);
591 593
592 context3d->deleteFramebuffer(object); 594 context3d->deleteFramebuffer(object);
593 } 595 }
594 596
595 bool WebGLFramebuffer::isBound() const 597 bool WebGLFramebuffer::isBound() const
596 { 598 {
597 return (context()->m_framebufferBinding.get() == this); 599 return (context()->m_framebufferBinding.get() == this);
598 } 600 }
599 601
600 void WebGLFramebuffer::drawBuffers(const Vector<GC3Denum>& bufs) 602 void WebGLFramebuffer::drawBuffers(const Vector<GC3Denum>& bufs)
601 { 603 {
602 m_drawBuffers = bufs; 604 m_drawBuffers = bufs;
603 m_filteredDrawBuffers.resize(m_drawBuffers.size()); 605 m_filteredDrawBuffers.resize(m_drawBuffers.size());
604 for (size_t i = 0; i < m_filteredDrawBuffers.size(); ++i) 606 for (size_t i = 0; i < m_filteredDrawBuffers.size(); ++i)
605 m_filteredDrawBuffers[i] = GraphicsContext3D::NONE; 607 m_filteredDrawBuffers[i] = GL_NONE;
606 drawBuffersIfNecessary(true); 608 drawBuffersIfNecessary(true);
607 } 609 }
608 610
609 void WebGLFramebuffer::drawBuffersIfNecessary(bool force) 611 void WebGLFramebuffer::drawBuffersIfNecessary(bool force)
610 { 612 {
611 if (!context()->m_webglDrawBuffers) 613 if (!context()->m_webglDrawBuffers)
612 return; 614 return;
613 bool reset = force; 615 bool reset = force;
614 // This filtering works around graphics driver bugs on Mac OS X. 616 // This filtering works around graphics driver bugs on Mac OS X.
615 for (size_t i = 0; i < m_drawBuffers.size(); ++i) { 617 for (size_t i = 0; i < m_drawBuffers.size(); ++i) {
616 if (m_drawBuffers[i] != GraphicsContext3D::NONE && getAttachment(m_drawB uffers[i])) { 618 if (m_drawBuffers[i] != GL_NONE && getAttachment(m_drawBuffers[i])) {
617 if (m_filteredDrawBuffers[i] != m_drawBuffers[i]) { 619 if (m_filteredDrawBuffers[i] != m_drawBuffers[i]) {
618 m_filteredDrawBuffers[i] = m_drawBuffers[i]; 620 m_filteredDrawBuffers[i] = m_drawBuffers[i];
619 reset = true; 621 reset = true;
620 } 622 }
621 } else { 623 } else {
622 if (m_filteredDrawBuffers[i] != GraphicsContext3D::NONE) { 624 if (m_filteredDrawBuffers[i] != GL_NONE) {
623 m_filteredDrawBuffers[i] = GraphicsContext3D::NONE; 625 m_filteredDrawBuffers[i] = GL_NONE;
624 reset = true; 626 reset = true;
625 } 627 }
626 } 628 }
627 } 629 }
628 if (reset) { 630 if (reset) {
629 context()->graphicsContext3D()->extensions()->drawBuffersEXT( 631 context()->graphicsContext3D()->extensions()->drawBuffersEXT(
630 m_filteredDrawBuffers.size(), m_filteredDrawBuffers.data()); 632 m_filteredDrawBuffers.size(), m_filteredDrawBuffers.data());
631 } 633 }
632 } 634 }
633 635
634 GC3Denum WebGLFramebuffer::getDrawBuffer(GC3Denum drawBuffer) 636 GC3Denum WebGLFramebuffer::getDrawBuffer(GC3Denum drawBuffer)
635 { 637 {
636 int index = static_cast<int>(drawBuffer - Extensions3D::DRAW_BUFFER0_EXT); 638 int index = static_cast<int>(drawBuffer - Extensions3D::DRAW_BUFFER0_EXT);
637 ASSERT(index >= 0); 639 ASSERT(index >= 0);
638 if (index < static_cast<int>(m_drawBuffers.size())) 640 if (index < static_cast<int>(m_drawBuffers.size()))
639 return m_drawBuffers[index]; 641 return m_drawBuffers[index];
640 if (drawBuffer == Extensions3D::DRAW_BUFFER0_EXT) 642 if (drawBuffer == Extensions3D::DRAW_BUFFER0_EXT)
641 return GraphicsContext3D::COLOR_ATTACHMENT0; 643 return GL_COLOR_ATTACHMENT0;
642 return GraphicsContext3D::NONE; 644 return GL_NONE;
643 } 645 }
644 646
645 } 647 }
OLDNEW
« no previous file with comments | « Source/core/html/canvas/WebGLDrawBuffers.cpp ('k') | Source/core/html/canvas/WebGLObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698