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

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

Issue 1834983003: Remove string-getting methods from WebGraphicsContext3D. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: getactive: pointers Created 4 years, 9 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/WebGLRenderingContextBase.cpp
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index 6f658860ffbd8694bd395ec5b1f3fcdb12b4f23e..a58d726a93bc6fbd7c9c5127ee9887bd315e98d0 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -53,6 +53,7 @@
#include "modules/webgl/EXTFragDepth.h"
#include "modules/webgl/EXTShaderTextureLOD.h"
#include "modules/webgl/EXTTextureFilterAnisotropic.h"
+#include "modules/webgl/GLStringQuery.h"
#include "modules/webgl/OESElementIndexUint.h"
#include "modules/webgl/OESStandardDerivatives.h"
#include "modules/webgl/OESTextureFloat.h"
@@ -2276,7 +2277,6 @@ WebGLActiveInfo* WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* progra
{
if (isContextLost() || !validateWebGLObject("getActiveAttrib", program))
return nullptr;
- WebGraphicsContext3D::ActiveInfo info;
GLuint programId = objectNonZero(program);
GLint maxNameLength = -1;
contextGL()->GetProgramiv(programId, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxNameLength);
@@ -2286,9 +2286,15 @@ WebGLActiveInfo* WebGLRenderingContextBase::getActiveAttrib(WebGLProgram* progra
synthesizeGLError(GL_INVALID_VALUE, "getActiveAttrib", "no active attributes exist");
return nullptr;
}
- if (!webContext()->getActiveAttrib(objectOrZero(program), index, info))
+ LChar* namePtr;
+ RefPtr<StringImpl> nameImpl = StringImpl::createUninitialized(maxNameLength, namePtr);
+ GLsizei length = 0;
+ GLint size = -1;
+ GLenum type = 0;
+ contextGL()->GetActiveAttrib(programId, index, maxNameLength, &length, &size, &type, reinterpret_cast<GLchar*>(namePtr));
+ if (size < 0)
return nullptr;
- return WebGLActiveInfo::create(info.name, info.type, info.size);
+ return WebGLActiveInfo::create(nameImpl->substring(0, length), type, size);
}
WebGLActiveInfo* WebGLRenderingContextBase::getActiveUniform(WebGLProgram* program, GLuint index)
@@ -2304,10 +2310,15 @@ WebGLActiveInfo* WebGLRenderingContextBase::getActiveUniform(WebGLProgram* progr
synthesizeGLError(GL_INVALID_VALUE, "getActiveUniform", "no active uniforms exist");
return nullptr;
}
- WebGraphicsContext3D::ActiveInfo info;
- if (!webContext()->getActiveUniform(programId, index, info))
+ LChar* namePtr;
+ RefPtr<StringImpl> nameImpl = StringImpl::createUninitialized(maxNameLength, namePtr);
+ GLsizei length = 0;
+ GLint size = -1;
+ GLenum type = 0;
+ contextGL()->GetActiveUniform(programId, index, maxNameLength, &length, &size, &type, reinterpret_cast<GLchar*>(namePtr));
+ if (size < 0)
return nullptr;
- return WebGLActiveInfo::create(info.name, info.type, info.size);
+ return WebGLActiveInfo::create(nameImpl->substring(0, length), type, size);
}
Nullable<HeapVector<Member<WebGLShader>>> WebGLRenderingContextBase::getAttachedShaders(WebGLProgram* program)
@@ -2838,7 +2849,8 @@ String WebGLRenderingContextBase::getProgramInfoLog(WebGLProgram* program)
{
if (isContextLost() || !validateWebGLObject("getProgramInfoLog", program))
return String();
- return ensureNotNull(webContext()->getProgramInfoLog(objectOrZero(program)));
+ GLStringQuery query(contextGL());
+ return query.Run<GLStringQuery::ProgramInfoLog>(objectNonZero(program));
}
ScriptValue WebGLRenderingContextBase::getRenderbufferParameter(ScriptState* scriptState, GLenum target, GLenum pname)
@@ -2905,7 +2917,8 @@ String WebGLRenderingContextBase::getShaderInfoLog(WebGLShader* shader)
{
if (isContextLost() || !validateWebGLObject("getShaderInfoLog", shader))
return String();
- return ensureNotNull(webContext()->getShaderInfoLog(objectOrZero(shader)));
+ GLStringQuery query(contextGL());
+ return query.Run<GLStringQuery::ShaderInfoLog>(objectNonZero(shader));
}
WebGLShaderPrecisionFormat* WebGLRenderingContextBase::getShaderPrecisionFormat(GLenum shaderType, GLenum precisionType)
@@ -3007,23 +3020,38 @@ ScriptValue WebGLRenderingContextBase::getUniform(ScriptState* scriptState, WebG
}
GLint location = uniformLocation->location();
+ GLuint programId = objectNonZero(program);
+ GLint maxNameLength = -1;
+ contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength);
+ if (maxNameLength < 0)
+ return ScriptValue::createNull(scriptState);
+ if (maxNameLength == 0) {
+ synthesizeGLError(GL_INVALID_VALUE, "getUniform", "no active uniforms exist");
+ return ScriptValue::createNull(scriptState);
+ }
+
// FIXME: make this more efficient using WebGLUniformLocation and caching types in it
GLint activeUniforms = 0;
- contextGL()->GetProgramiv(objectOrZero(program), GL_ACTIVE_UNIFORMS, &activeUniforms);
+ contextGL()->GetProgramiv(programId, GL_ACTIVE_UNIFORMS, &activeUniforms);
for (GLint i = 0; i < activeUniforms; i++) {
- WebGraphicsContext3D::ActiveInfo info;
- if (!webContext()->getActiveUniform(objectOrZero(program), i, info))
+ LChar* namePtr;
+ RefPtr<StringImpl> nameImpl = StringImpl::createUninitialized(maxNameLength, namePtr);
+ GLsizei length = 0;
+ GLint size = -1;
+ GLenum type = 0;
+ contextGL()->GetActiveUniform(programId, i, maxNameLength, &length, &size, &type, reinterpret_cast<GLchar*>(namePtr));
+ if (size < 0)
return ScriptValue::createNull(scriptState);
- String name = info.name;
+ String name(nameImpl->substring(0, length));
StringBuilder nameBuilder;
// Strip "[0]" from the name if it's an array.
- if (info.size > 1 && name.endsWith("[0]"))
- info.name = name.left(name.length() - 3);
+ if (size > 1 && name.endsWith("[0]"))
+ name = name.left(name.length() - 3);
// If it's an array, we need to iterate through each element, appending "[index]" to the name.
- for (GLint index = 0; index < info.size; ++index) {
+ for (GLint index = 0; index < size; ++index) {
nameBuilder.clear();
- nameBuilder.append(info.name);
- if (info.size > 1 && index >= 1) {
+ nameBuilder.append(name);
+ if (size > 1 && index >= 1) {
nameBuilder.append('[');
nameBuilder.appendNumber(index);
nameBuilder.append(']');
@@ -3034,7 +3062,7 @@ ScriptValue WebGLRenderingContextBase::getUniform(ScriptState* scriptState, WebG
// Found it. Use the type in the ActiveInfo to determine the return type.
GLenum baseType;
unsigned length;
- switch (info.type) {
+ switch (type) {
case GL_BOOL:
baseType = GL_BOOL;
length = 1;
@@ -3107,7 +3135,7 @@ ScriptValue WebGLRenderingContextBase::getUniform(ScriptState* scriptState, WebG
return ScriptValue::createNull(scriptState);
}
// handle GLenums for WebGL 2.0 or higher
- switch (info.type) {
+ switch (type) {
case GL_UNSIGNED_INT:
baseType = GL_UNSIGNED_INT;
length = 1;

Powered by Google App Engine
This is Rietveld 408576698