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

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp

Issue 2457363002: Add offset arguments to readPixels and compressedTex* per WebGL 2.0 spec. (Closed)
Patch Set: Rebased. Created 4 years, 1 month 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 b93ad380644b303da9804b8045d021c3aedf5b28..97d8f1c1a0c67d456beb5a4108fa5da17dfc61dd 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -911,8 +911,26 @@ void WebGL2RenderingContextBase::readPixels(GLint x,
return;
}
- WebGLRenderingContextBase::readPixels(x, y, width, height, format, type,
- pixels);
+ readPixelsHelper(x, y, width, height, format, type, pixels, 0);
+}
+
+void WebGL2RenderingContextBase::readPixels(GLint x,
+ GLint y,
+ GLsizei width,
+ GLsizei height,
+ GLenum format,
+ GLenum type,
+ DOMArrayBufferView* pixels,
+ GLuint offset) {
+ if (isContextLost())
+ return;
+ if (m_boundPixelPackBuffer.get()) {
+ synthesizeGLError(GL_INVALID_OPERATION, "readPixels",
+ "PIXEL_PACK buffer should not be bound");
+ return;
+ }
+
+ readPixelsHelper(x, y, width, height, format, type, pixels, offset);
}
void WebGL2RenderingContextBase::readPixels(GLint x,
@@ -1941,6 +1959,96 @@ void WebGL2RenderingContextBase::copyTexSubImage3D(GLenum target,
width, height);
}
+void WebGL2RenderingContextBase::compressedTexImage2D(
+ GLenum target,
+ GLint level,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ DOMArrayBufferView* data) {
+ WebGLRenderingContextBase::compressedTexImage2D(target, level, internalformat,
+ width, height, border, data);
+}
+
+void WebGL2RenderingContextBase::compressedTexImage2D(
+ GLenum target,
+ GLint level,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLint border,
+ DOMArrayBufferView* data,
+ GLuint srcOffset,
+ GLuint srcLengthOverride) {
+ if (isContextLost())
+ return;
+ if (!validateTexture2DBinding("compressedTexImage2D", target))
+ return;
+ if (!validateCompressedTexFormat("compressedTexImage2D", internalformat))
+ return;
+ if (srcOffset > data->byteLength()) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D",
+ "srcOffset is out of range");
+ return;
+ }
+ if (srcLengthOverride == 0) {
+ srcLengthOverride = data->byteLength() - srcOffset;
+ } else if (srcLengthOverride > data->byteLength() - srcOffset) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D",
+ "srcLengthOverride is out of range");
+ }
+ contextGL()->CompressedTexImage2D(
+ target, level, internalformat, width, height, border, srcLengthOverride,
+ static_cast<uint8_t*>(data->baseAddress()) + srcOffset);
+}
+
+void WebGL2RenderingContextBase::compressedTexSubImage2D(
+ GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei width,
+ GLsizei height,
+ GLenum format,
+ DOMArrayBufferView* data) {
+ WebGLRenderingContextBase::compressedTexSubImage2D(
+ target, level, xoffset, yoffset, width, height, format, data);
+}
+
+void WebGL2RenderingContextBase::compressedTexSubImage2D(
+ GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei width,
+ GLsizei height,
+ GLenum format,
+ DOMArrayBufferView* data,
+ GLuint srcOffset,
+ GLuint srcLengthOverride) {
+ if (isContextLost())
+ return;
+ if (!validateTexture2DBinding("compressedTexSubImage2D", target))
+ return;
+ if (!validateCompressedTexFormat("compressedTexSubImage2D", format))
+ return;
+ if (srcOffset > data->byteLength()) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage2D",
+ "srcOffset is out of range");
+ return;
+ }
+ if (srcLengthOverride == 0) {
+ srcLengthOverride = data->byteLength() - srcOffset;
+ } else if (srcLengthOverride > data->byteLength() - srcOffset) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage2D",
+ "srcLengthOverride is out of range");
+ }
+ contextGL()->CompressedTexSubImage2D(
+ target, level, xoffset, yoffset, width, height, format, srcLengthOverride,
+ static_cast<uint8_t*>(data->baseAddress()) + srcOffset);
+}
+
void WebGL2RenderingContextBase::compressedTexImage3D(
GLenum target,
GLint level,
@@ -1949,16 +2057,30 @@ void WebGL2RenderingContextBase::compressedTexImage3D(
GLsizei height,
GLsizei depth,
GLint border,
- DOMArrayBufferView* data) {
+ DOMArrayBufferView* data,
+ GLuint srcOffset,
+ GLuint srcLengthOverride) {
if (isContextLost())
return;
if (!validateTexture3DBinding("compressedTexImage3D", target))
return;
if (!validateCompressedTexFormat("compressedTexImage3D", internalformat))
return;
- contextGL()->CompressedTexImage3D(target, level, internalformat, width,
- height, depth, border, data->byteLength(),
- data->baseAddress());
+ if (srcOffset > data->byteLength()) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D",
+ "srcOffset is out of range");
+ return;
+ }
+ if (srcLengthOverride == 0) {
+ srcLengthOverride = data->byteLength() - srcOffset;
+ } else if (srcLengthOverride > data->byteLength() - srcOffset) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D",
+ "srcLengthOverride is out of range");
+ }
+ contextGL()->CompressedTexImage3D(
+ target, level, internalformat, width, height, depth, border,
+ srcLengthOverride,
+ static_cast<uint8_t*>(data->baseAddress()) + srcOffset);
}
void WebGL2RenderingContextBase::compressedTexSubImage3D(
@@ -1971,16 +2093,30 @@ void WebGL2RenderingContextBase::compressedTexSubImage3D(
GLsizei height,
GLsizei depth,
GLenum format,
- DOMArrayBufferView* data) {
+ DOMArrayBufferView* data,
+ GLuint srcOffset,
+ GLuint srcLengthOverride) {
if (isContextLost())
return;
if (!validateTexture3DBinding("compressedTexSubImage3D", target))
return;
if (!validateCompressedTexFormat("compressedTexSubImage3D", format))
return;
- contextGL()->CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset,
- width, height, depth, format,
- data->byteLength(), data->baseAddress());
+ if (srcOffset > data->byteLength()) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D",
+ "srcOffset is out of range");
+ return;
+ }
+ if (srcLengthOverride == 0) {
+ srcLengthOverride = data->byteLength() - srcOffset;
+ } else if (srcLengthOverride > data->byteLength() - srcOffset) {
+ synthesizeGLError(GL_INVALID_VALUE, "compressedTexSubImage3D",
+ "srcLengthOverride is out of range");
+ }
+ contextGL()->CompressedTexSubImage3D(
+ target, level, xoffset, yoffset, zoffset, width, height, depth, format,
+ srcLengthOverride,
+ static_cast<uint8_t*>(data->baseAddress()) + srcOffset);
}
GLint WebGL2RenderingContextBase::getFragDataLocation(WebGLProgram* program,

Powered by Google App Engine
This is Rietveld 408576698