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

Side by Side Diff: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp

Issue 2809873003: Implement sub source for WebGL2's clearBuffer*(). (Closed)
Patch Set: rebase Created 3 years, 8 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/webgl/WebGL2RenderingContextBase.h" 5 #include "modules/webgl/WebGL2RenderingContextBase.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include "bindings/modules/v8/WebGLAny.h" 8 #include "bindings/modules/v8/WebGLAny.h"
9 #include "core/frame/ImageBitmap.h" 9 #include "core/frame/ImageBitmap.h"
10 #include "core/html/HTMLCanvasElement.h" 10 #include "core/html/HTMLCanvasElement.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 // type size is at most 8, so no overflow. 60 // type size is at most 8, so no overflow.
61 byte_length = sub_length * type_size; 61 byte_length = sub_length * type_size;
62 } 62 }
63 long long byte_offset = 0; 63 long long byte_offset = 0;
64 if (sub_offset) { 64 if (sub_offset) {
65 // type size is at most 8, so no overflow. 65 // type size is at most 8, so no overflow.
66 byte_offset = sub_offset * type_size; 66 byte_offset = sub_offset * type_size;
67 } 67 }
68 CheckedNumeric<long long> total = byte_offset; 68 CheckedNumeric<long long> total = byte_offset;
69 total += byte_length; 69 total += byte_length;
70 if (!total.IsValid() || total.ValueOrDie() > view->byteLength()) { 70 if (!total.IsValid() || total.ValueOrDefault(0) > view->byteLength()) {
Ken Russell (switch to Gerrit) 2017/04/12 18:56:49 Here and throughout, I think we should continue to
Zhenyao Mo 2017/04/12 20:14:53 Done.
71 return false; 71 return false;
72 } 72 }
73 if (!byte_length) { 73 if (!byte_length) {
74 byte_length = view->byteLength() - byte_offset; 74 byte_length = view->byteLength() - byte_offset;
75 } 75 }
76 uint8_t* data = static_cast<uint8_t*>(view->BaseAddress()); 76 uint8_t* data = static_cast<uint8_t*>(view->BaseAddress());
77 data += byte_offset; 77 data += byte_offset;
78 *out_base_address = data; 78 *out_base_address = data;
79 *out_byte_length = byte_length; 79 *out_byte_length = byte_length;
80 return true; 80 return true;
(...skipping 3375 matching lines...) Expand 10 before | Expand all | Expand 10 after
3456 "COLOR_ATTACHMENTi_EXT or NONE"); 3456 "COLOR_ATTACHMENTi_EXT or NONE");
3457 return; 3457 return;
3458 } 3458 }
3459 } 3459 }
3460 framebuffer_binding_->DrawBuffers(buffers); 3460 framebuffer_binding_->DrawBuffers(buffers);
3461 } 3461 }
3462 } 3462 }
3463 3463
3464 bool WebGL2RenderingContextBase::ValidateClearBuffer(const char* function_name, 3464 bool WebGL2RenderingContextBase::ValidateClearBuffer(const char* function_name,
3465 GLenum buffer, 3465 GLenum buffer,
3466 GLsizei size) { 3466 GLsizei size,
3467 GLuint src_offset) {
3468 CheckedNumeric<GLsizei> checked_size(size);
3469 checked_size -= src_offset;
3470 if (!checked_size.IsValid()) {
3471 SynthesizeGLError(GL_INVALID_VALUE, function_name,
3472 "invalid array size / srcOffset");
3473 return false;
3474 }
3467 switch (buffer) { 3475 switch (buffer) {
3468 case GL_COLOR: 3476 case GL_COLOR:
3469 if (size < 4) { 3477 if (checked_size.ValueOrDefault(0) < 4) {
3470 SynthesizeGLError(GL_INVALID_VALUE, function_name, 3478 SynthesizeGLError(GL_INVALID_VALUE, function_name,
3471 "invalid array size"); 3479 "invalid array size / srcOffset");
3472 return false; 3480 return false;
3473 } 3481 }
3474 break; 3482 break;
3475 case GL_DEPTH: 3483 case GL_DEPTH:
3476 case GL_STENCIL: 3484 case GL_STENCIL:
3477 if (size < 1) { 3485 if (checked_size.ValueOrDefault(0) < 1) {
3478 SynthesizeGLError(GL_INVALID_VALUE, function_name, 3486 SynthesizeGLError(GL_INVALID_VALUE, function_name,
3479 "invalid array size"); 3487 "invalid array size / srcOffset");
3480 return false; 3488 return false;
3481 } 3489 }
3482 break; 3490 break;
3483 default: 3491 default:
3484 SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid buffer"); 3492 SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid buffer");
3485 return false; 3493 return false;
3486 } 3494 }
3487 return true; 3495 return true;
3488 } 3496 }
3489 3497
3490 WebGLTexture* WebGL2RenderingContextBase::ValidateTexImageBinding( 3498 WebGLTexture* WebGL2RenderingContextBase::ValidateTexImageBinding(
3491 const char* func_name, 3499 const char* func_name,
3492 TexImageFunctionID function_id, 3500 TexImageFunctionID function_id,
3493 GLenum target) { 3501 GLenum target) {
3494 if (function_id == kTexImage3D || function_id == kTexSubImage3D) 3502 if (function_id == kTexImage3D || function_id == kTexSubImage3D)
3495 return ValidateTexture3DBinding(func_name, target); 3503 return ValidateTexture3DBinding(func_name, target);
3496 return ValidateTexture2DBinding(func_name, target); 3504 return ValidateTexture2DBinding(func_name, target);
3497 } 3505 }
3498 3506
3499 void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, 3507 void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer,
3500 GLint drawbuffer, 3508 GLint drawbuffer,
3501 NotShared<DOMInt32Array> value) { 3509 NotShared<DOMInt32Array> value,
3510 GLuint src_offset) {
3502 if (isContextLost() || 3511 if (isContextLost() ||
3503 !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length())) 3512 !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length(),
3513 src_offset))
3504 return; 3514 return;
3505 3515
3506 ContextGL()->ClearBufferiv(buffer, drawbuffer, value.View()->Data()); 3516 ContextGL()->ClearBufferiv(buffer, drawbuffer,
3517 value.View()->Data() + src_offset);
3507 } 3518 }
3508 3519
3509 void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer, 3520 void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer,
3510 GLint drawbuffer, 3521 GLint drawbuffer,
3511 const Vector<GLint>& value) { 3522 const Vector<GLint>& value,
3523 GLuint src_offset) {
3512 if (isContextLost() || 3524 if (isContextLost() ||
3513 !ValidateClearBuffer("clearBufferiv", buffer, value.size())) 3525 !ValidateClearBuffer("clearBufferiv", buffer, value.size(), src_offset))
3514 return; 3526 return;
3515 3527
3516 ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data()); 3528 ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data() + src_offset);
3517 }
3518
3519 void WebGL2RenderingContextBase::clearBufferuiv(
3520 GLenum buffer,
3521 GLint drawbuffer,
3522 NotShared<DOMUint32Array> value) {
3523 if (isContextLost() ||
3524 !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length()))
3525 return;
3526
3527 ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.View()->Data());
3528 } 3529 }
3529 3530
3530 void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer, 3531 void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer,
3531 GLint drawbuffer, 3532 GLint drawbuffer,
3532 const Vector<GLuint>& value) { 3533 NotShared<DOMUint32Array> value,
3534 GLuint src_offset) {
3533 if (isContextLost() || 3535 if (isContextLost() ||
3534 !ValidateClearBuffer("clearBufferuiv", buffer, value.size())) 3536 !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length(),
3537 src_offset))
3535 return; 3538 return;
3536 3539
3537 ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data()); 3540 ContextGL()->ClearBufferuiv(buffer, drawbuffer,
3541 value.View()->Data() + src_offset);
3538 } 3542 }
3539 3543
3540 void WebGL2RenderingContextBase::clearBufferfv( 3544 void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer,
3541 GLenum buffer, 3545 GLint drawbuffer,
3542 GLint drawbuffer, 3546 const Vector<GLuint>& value,
3543 NotShared<DOMFloat32Array> value) { 3547 GLuint src_offset) {
3544 if (isContextLost() || 3548 if (isContextLost() ||
3545 !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length())) 3549 !ValidateClearBuffer("clearBufferuiv", buffer, value.size(), src_offset))
3546 return; 3550 return;
3547 3551
3548 ContextGL()->ClearBufferfv(buffer, drawbuffer, value.View()->Data()); 3552 ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data() + src_offset);
3549 } 3553 }
3550 3554
3551 void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer, 3555 void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer,
3552 GLint drawbuffer, 3556 GLint drawbuffer,
3553 const Vector<GLfloat>& value) { 3557 NotShared<DOMFloat32Array> value,
3558 GLuint src_offset) {
3554 if (isContextLost() || 3559 if (isContextLost() ||
3555 !ValidateClearBuffer("clearBufferfv", buffer, value.size())) 3560 !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length(),
3561 src_offset))
3556 return; 3562 return;
3557 3563
3558 ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data()); 3564 ContextGL()->ClearBufferfv(buffer, drawbuffer,
3565 value.View()->Data() + src_offset);
3566 }
3567
3568 void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer,
3569 GLint drawbuffer,
3570 const Vector<GLfloat>& value,
3571 GLuint src_offset) {
3572 if (isContextLost() ||
3573 !ValidateClearBuffer("clearBufferfv", buffer, value.size(), src_offset))
3574 return;
3575
3576 ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data() + src_offset);
3559 } 3577 }
3560 3578
3561 void WebGL2RenderingContextBase::clearBufferfi(GLenum buffer, 3579 void WebGL2RenderingContextBase::clearBufferfi(GLenum buffer,
3562 GLint drawbuffer, 3580 GLint drawbuffer,
3563 GLfloat depth, 3581 GLfloat depth,
3564 GLint stencil) { 3582 GLint stencil) {
3565 if (isContextLost()) 3583 if (isContextLost())
3566 return; 3584 return;
3567 3585
3568 ContextGL()->ClearBufferfi(buffer, drawbuffer, depth, stencil); 3586 ContextGL()->ClearBufferfi(buffer, drawbuffer, depth, stencil);
(...skipping 2056 matching lines...) Expand 10 before | Expand all | Expand 10 after
5625 return nullptr; 5643 return nullptr;
5626 } 5644 }
5627 5645
5628 const char* WebGL2RenderingContextBase::ValidateGetBufferSubDataBounds( 5646 const char* WebGL2RenderingContextBase::ValidateGetBufferSubDataBounds(
5629 const char* function_name, 5647 const char* function_name,
5630 WebGLBuffer* source_buffer, 5648 WebGLBuffer* source_buffer,
5631 GLintptr source_byte_offset, 5649 GLintptr source_byte_offset,
5632 long long destination_byte_length) { 5650 long long destination_byte_length) {
5633 CheckedNumeric<long long> src_end = source_byte_offset; 5651 CheckedNumeric<long long> src_end = source_byte_offset;
5634 src_end += destination_byte_length; 5652 src_end += destination_byte_length;
5635 if (!src_end.IsValid() || src_end.ValueOrDie() > source_buffer->GetSize()) { 5653 if (!src_end.IsValid() ||
5654 src_end.ValueOrDefault(0) > source_buffer->GetSize()) {
5636 SynthesizeGLError(GL_INVALID_VALUE, function_name, 5655 SynthesizeGLError(GL_INVALID_VALUE, function_name,
5637 "overflow of bound buffer"); 5656 "overflow of bound buffer");
5638 return "Invalid value: overflow of bound buffer"; 5657 return "Invalid value: overflow of bound buffer";
5639 } 5658 }
5640 5659
5641 return nullptr; 5660 return nullptr;
5642 } 5661 }
5643 5662
5644 void WebGL2RenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) { 5663 void WebGL2RenderingContextBase::RemoveBoundBuffer(WebGLBuffer* buffer) {
5645 if (bound_copy_read_buffer_ == buffer) 5664 if (bound_copy_read_buffer_ == buffer)
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
5690 5709
5691 void WebGL2RenderingContextBase:: 5710 void WebGL2RenderingContextBase::
5692 DrawingBufferClientRestorePixelUnpackBufferBinding() { 5711 DrawingBufferClientRestorePixelUnpackBufferBinding() {
5693 if (!ContextGL()) 5712 if (!ContextGL())
5694 return; 5713 return;
5695 ContextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 5714 ContextGL()->BindBuffer(GL_PIXEL_UNPACK_BUFFER,
5696 ObjectOrZero(bound_pixel_unpack_buffer_.Get())); 5715 ObjectOrZero(bound_pixel_unpack_buffer_.Get()));
5697 } 5716 }
5698 5717
5699 } // namespace blink 5718 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698