bool ValidateGLSLVariableName(const nsAString& name, WebGLContext* webgl, const char* funcName) { if (name.IsEmpty()) return false; const uint32_t maxSize = 256; if (name.Length() > maxSize) { webgl->ErrorInvalidValue("%s: Identifier is %d characters long, exceeds the" " maximum allowed length of %d characters.", funcName, name.Length(), maxSize); return false; } if (!ValidateGLSLString(name, webgl, funcName)) return false; nsString prefix1 = NS_LITERAL_STRING("webgl_"); nsString prefix2 = NS_LITERAL_STRING("_webgl_"); if (Substring(name, 0, prefix1.Length()).Equals(prefix1) || Substring(name, 0, prefix2.Length()).Equals(prefix2)) { webgl->ErrorInvalidOperation("%s: String contains a reserved GLSL prefix.", funcName); return false; } return true; }
void WebGLShader::ShaderSource(const nsAString& source) { StripComments stripComments(source); const nsAString& cleanSource = Substring(stripComments.result().Elements(), stripComments.length()); if (!ValidateGLSLString(cleanSource, mContext, "shaderSource")) return; // We checked that the source stripped of comments is in the // 7-bit ASCII range, so we can skip the NS_IsAscii() check. const NS_LossyConvertUTF16toASCII sourceCString(cleanSource); if (mContext->gl->WorkAroundDriverBugs()) { const size_t maxSourceLength = 0x3ffff; if (sourceCString.Length() > maxSourceLength) { mContext->ErrorInvalidValue("shaderSource: Source has more than %d" " characters. (Driver workaround)", maxSourceLength); return; } } if (PR_GetEnv("MOZ_WEBGL_DUMP_SHADERS")) { printf_stderr("////////////////////////////////////////\n"); printf_stderr("// MOZ_WEBGL_DUMP_SHADERS:\n"); // Wow - Roll Your Own Foreach-Lines because printf_stderr has a hard-coded // internal size, so long strings are truncated. int32_t start = 0; int32_t end = sourceCString.Find("\n", false, start, -1); while (end > -1) { const nsCString line(sourceCString.BeginReading() + start, end - start); printf_stderr("%s\n", line.BeginReading()); start = end + 1; end = sourceCString.Find("\n", false, start, -1); } printf_stderr("////////////////////////////////////////\n"); } mSource = source; mCleanSource = sourceCString; }
void WebGLShader::ShaderSource(const nsAString& source) { StripComments stripComments(source); const nsAString& cleanSource = Substring(stripComments.result().Elements(), stripComments.length()); if (!ValidateGLSLString(cleanSource, mContext, "shaderSource")) return; // We checked that the source stripped of comments is in the // 7-bit ASCII range, so we can skip the NS_IsAscii() check. NS_LossyConvertUTF16toASCII sourceCString(cleanSource); if (mContext->gl->WorkAroundDriverBugs()) { const size_t maxSourceLength = 0x3ffff; if (sourceCString.Length() > maxSourceLength) { mContext->ErrorInvalidValue("shaderSource: Source has more than %d" " characters. (Driver workaround)", maxSourceLength); return; } } // HACK - dump shader source { /* printf_stderr("//-*- glsl -*-\n"); // Wow - Roll Your Own For Each Lines because printf_stderr has a hard-coded internal size, so long strings are truncated. const nsString& src = shader->Source(); int32_t start = 0; int32_t end = src.Find("\n", false, start, -1); while (end > -1) { printf_stderr("%s\n", NS_ConvertUTF16toUTF8(nsDependentSubstring(src, start, end - start)).get()); start = end + 1; end = src.Find("\n", false, start, -1); } printf_stderr("//\n"); */ } // HACK mSource = source; mCleanSource = sourceCString; }