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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
index 9a902001dac684e122478db4de383c8623ee1e3c..eb30a5b07daec212a51e1d529140db084b3ae25a 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -67,7 +67,7 @@ bool ValidateSubSourceAndGetData(DOMArrayBufferView* view,
}
CheckedNumeric<long long> total = byte_offset;
total += byte_length;
- if (!total.IsValid() || total.ValueOrDie() > view->byteLength()) {
+ 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.
return false;
}
if (!byte_length) {
@@ -3463,20 +3463,28 @@ void WebGL2RenderingContextBase::drawBuffers(const Vector<GLenum>& buffers) {
bool WebGL2RenderingContextBase::ValidateClearBuffer(const char* function_name,
GLenum buffer,
- GLsizei size) {
+ GLsizei size,
+ GLuint src_offset) {
+ CheckedNumeric<GLsizei> checked_size(size);
+ checked_size -= src_offset;
+ if (!checked_size.IsValid()) {
+ SynthesizeGLError(GL_INVALID_VALUE, function_name,
+ "invalid array size / srcOffset");
+ return false;
+ }
switch (buffer) {
case GL_COLOR:
- if (size < 4) {
+ if (checked_size.ValueOrDefault(0) < 4) {
SynthesizeGLError(GL_INVALID_VALUE, function_name,
- "invalid array size");
+ "invalid array size / srcOffset");
return false;
}
break;
case GL_DEPTH:
case GL_STENCIL:
- if (size < 1) {
+ if (checked_size.ValueOrDefault(0) < 1) {
SynthesizeGLError(GL_INVALID_VALUE, function_name,
- "invalid array size");
+ "invalid array size / srcOffset");
return false;
}
break;
@@ -3498,64 +3506,74 @@ WebGLTexture* WebGL2RenderingContextBase::ValidateTexImageBinding(
void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer,
GLint drawbuffer,
- NotShared<DOMInt32Array> value) {
+ NotShared<DOMInt32Array> value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length()))
+ !ValidateClearBuffer("clearBufferiv", buffer, value.View()->length(),
+ src_offset))
return;
- ContextGL()->ClearBufferiv(buffer, drawbuffer, value.View()->Data());
+ ContextGL()->ClearBufferiv(buffer, drawbuffer,
+ value.View()->Data() + src_offset);
}
void WebGL2RenderingContextBase::clearBufferiv(GLenum buffer,
GLint drawbuffer,
- const Vector<GLint>& value) {
+ const Vector<GLint>& value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferiv", buffer, value.size()))
+ !ValidateClearBuffer("clearBufferiv", buffer, value.size(), src_offset))
return;
- ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data());
+ ContextGL()->ClearBufferiv(buffer, drawbuffer, value.Data() + src_offset);
}
-void WebGL2RenderingContextBase::clearBufferuiv(
- GLenum buffer,
- GLint drawbuffer,
- NotShared<DOMUint32Array> value) {
+void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer,
+ GLint drawbuffer,
+ NotShared<DOMUint32Array> value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length()))
+ !ValidateClearBuffer("clearBufferuiv", buffer, value.View()->length(),
+ src_offset))
return;
- ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.View()->Data());
+ ContextGL()->ClearBufferuiv(buffer, drawbuffer,
+ value.View()->Data() + src_offset);
}
void WebGL2RenderingContextBase::clearBufferuiv(GLenum buffer,
GLint drawbuffer,
- const Vector<GLuint>& value) {
+ const Vector<GLuint>& value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferuiv", buffer, value.size()))
+ !ValidateClearBuffer("clearBufferuiv", buffer, value.size(), src_offset))
return;
- ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data());
+ ContextGL()->ClearBufferuiv(buffer, drawbuffer, value.Data() + src_offset);
}
-void WebGL2RenderingContextBase::clearBufferfv(
- GLenum buffer,
- GLint drawbuffer,
- NotShared<DOMFloat32Array> value) {
+void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer,
+ GLint drawbuffer,
+ NotShared<DOMFloat32Array> value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length()))
+ !ValidateClearBuffer("clearBufferfv", buffer, value.View()->length(),
+ src_offset))
return;
- ContextGL()->ClearBufferfv(buffer, drawbuffer, value.View()->Data());
+ ContextGL()->ClearBufferfv(buffer, drawbuffer,
+ value.View()->Data() + src_offset);
}
void WebGL2RenderingContextBase::clearBufferfv(GLenum buffer,
GLint drawbuffer,
- const Vector<GLfloat>& value) {
+ const Vector<GLfloat>& value,
+ GLuint src_offset) {
if (isContextLost() ||
- !ValidateClearBuffer("clearBufferfv", buffer, value.size()))
+ !ValidateClearBuffer("clearBufferfv", buffer, value.size(), src_offset))
return;
- ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data());
+ ContextGL()->ClearBufferfv(buffer, drawbuffer, value.Data() + src_offset);
}
void WebGL2RenderingContextBase::clearBufferfi(GLenum buffer,
@@ -5632,7 +5650,8 @@ const char* WebGL2RenderingContextBase::ValidateGetBufferSubDataBounds(
long long destination_byte_length) {
CheckedNumeric<long long> src_end = source_byte_offset;
src_end += destination_byte_length;
- if (!src_end.IsValid() || src_end.ValueOrDie() > source_buffer->GetSize()) {
+ if (!src_end.IsValid() ||
+ src_end.ValueOrDefault(0) > source_buffer->GetSize()) {
SynthesizeGLError(GL_INVALID_VALUE, function_name,
"overflow of bound buffer");
return "Invalid value: overflow of bound buffer";

Powered by Google App Engine
This is Rietveld 408576698