Bug 1465964 - Add translated source to MOZ_WEBGL_DUMP_SHADER spew. - r=kvark

MozReview-Commit-ID: BDb64RqX537
This commit is contained in:
Jeff Gilbert 2018-05-31 13:58:53 -07:00
Родитель 680ca035e7
Коммит 261d4ed101
1 изменённых файлов: 37 добавлений и 27 удалений

Просмотреть файл

@ -19,6 +19,27 @@
namespace mozilla {
static void
PrintLongString(const char* const begin, const size_t len)
{
// Wow - Roll Your Own Foreach-Lines because printf_stderr has a hard-coded
// internal size, so long strings are truncated.
const size_t chunkSize = 1000;
const UniqueBuffer buf(moz_xmalloc(chunkSize+1)); // +1 for null-term
const auto bufBegin = (char*)buf.get();
bufBegin[chunkSize] = '\0';
auto chunkBegin = begin;
const auto end = begin + len;
while (chunkBegin + chunkSize < end) {
memcpy(bufBegin, chunkBegin, chunkSize);
printf_stderr("%s", bufBegin);
chunkBegin += chunkSize;
}
printf_stderr("%s", chunkBegin);
}
// On success, writes to out_validator and out_translatedSource.
// On failure, writes to out_translationLog.
static bool
@ -166,33 +187,6 @@ WebGLShader::ShaderSource(const nsAString& source)
// 7-bit ASCII range, so we can skip the NS_IsAscii() check.
const NS_LossyConvertUTF16toASCII cleanSource(sourceWithoutComments);
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.
const size_t maxChunkSize = 1024-1; // -1 for null-term.
const UniqueBuffer buf(moz_xmalloc(maxChunkSize+1)); // +1 for null-term
const auto bufBegin = (char*)buf.get();
size_t chunkStart = 0;
while (chunkStart != cleanSource.Length()) {
const auto chunkEnd = std::min(chunkStart + maxChunkSize,
size_t(cleanSource.Length()));
const auto chunkSize = chunkEnd - chunkStart;
memcpy(bufBegin, cleanSource.BeginReading() + chunkStart, chunkSize);
bufBegin[chunkSize + 1] = '\0';
printf_stderr("%s", bufBegin);
chunkStart += chunkSize;
}
printf_stderr("////////////////////////////////////////\n");
}
mSource = source;
mCleanSource = cleanSource;
}
@ -208,6 +202,12 @@ WebGLShader::CompileShader()
mValidator.reset(mContext->CreateShaderValidator(mType));
static const bool kDumpShaders = PR_GetEnv("MOZ_WEBGL_DUMP_SHADERS");
if (MOZ_UNLIKELY(kDumpShaders)) {
printf_stderr("==== begin MOZ_WEBGL_DUMP_SHADERS ====\n");
PrintLongString(mCleanSource.BeginReading(), mCleanSource.Length());
}
bool success;
if (mValidator) {
success = Translate(mCleanSource, mValidator.get(), &mValidationLog,
@ -217,6 +217,16 @@ WebGLShader::CompileShader()
&mValidationLog, &mTranslatedSource);
}
if (MOZ_UNLIKELY(kDumpShaders)) {
printf_stderr("\n==== \\/ \\/ \\/ ====\n");
if (success) {
PrintLongString(mTranslatedSource.BeginReading(), mTranslatedSource.Length());
} else {
printf_stderr("Validation failed:\n%s", mValidationLog.BeginReading());
}
printf_stderr("\n==== end ====\n");
}
if (!success)
return;