Commit 5b16123d by Cody Northrop Committed by Commit Bot

Capture/Replay: Refactor default uniform handling for arrays

Instead of walking through uniform locations, walk through the uniforms themselves and emit arrayed uniforms, which consume multiple locations. Test: MEC capture of Manhattan on Windows Bug: angleproject:3662 Change-Id: Ifd25528721982847d4f0938f469a914a1cb908c5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2175994 Commit-Queue: Cody Northrop <cnorthrop@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 428e4415
...@@ -1403,24 +1403,9 @@ void CaptureUpdateUniformValues(const gl::State &replayState, ...@@ -1403,24 +1403,9 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
const gl::Program *program, const gl::Program *program,
std::vector<CallCapture> *callsOut) std::vector<CallCapture> *callsOut)
{ {
const std::vector<gl::LinkedUniform> &uniforms = program->getState().getUniforms();
const std::vector<gl::VariableLocation> &locations = program->getUniformLocations();
for (const gl::VariableLocation &location : locations)
{
const gl::LinkedUniform &uniform = uniforms[location.index];
if (!program->isLinked()) if (!program->isLinked())
{ {
// We can't populate uniforms if the program hasn't been linked // We can't populate uniforms if the program hasn't been linked
continue;
}
if (uniform.isArray())
{
// TODO (cnorthrop): http://anglebug.com/3662
// Add support for array uniforms
UNIMPLEMENTED();
return; return;
} }
...@@ -1429,69 +1414,99 @@ void CaptureUpdateUniformValues(const gl::State &replayState, ...@@ -1429,69 +1414,99 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
Capture(callsOut, CaptureUseProgram(replayState, true, program->id())); Capture(callsOut, CaptureUseProgram(replayState, true, program->id()));
CaptureUpdateCurrentProgram(callsOut->back(), callsOut); CaptureUpdateCurrentProgram(callsOut->back(), callsOut);
const std::vector<gl::LinkedUniform> &uniforms = program->getState().getUniforms();
for (size_t i = 0; i < uniforms.size(); i++)
{
const gl::LinkedUniform &uniform = uniforms[i];
std::string uniformName = uniform.name;
int uniformCount = 1;
if (uniform.isArray())
{
if (uniform.isArrayOfArrays())
{
UNIMPLEMENTED();
continue;
}
uniformCount = uniform.arraySizes[0];
uniformName = gl::StripLastArrayIndex(uniformName);
}
gl::UniformLocation uniformLoc = program->getUniformLocation(uniformName);
const gl::UniformTypeInfo *typeInfo = uniform.typeInfo; const gl::UniformTypeInfo *typeInfo = uniform.typeInfo;
gl::UniformLocation uniformLoc = {static_cast<int>(location.index)}; int uniformSize = uniformCount * typeInfo->componentCount;
switch (typeInfo->componentType) switch (typeInfo->componentType)
{ {
case GL_FLOAT: case GL_FLOAT:
{ {
std::vector<GLfloat> components(typeInfo->componentCount); std::vector<GLfloat> uniformBuffer(uniformSize);
program->getUniformfv(context, uniformLoc, components.data()); program->getUniformfv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->type) switch (typeInfo->type)
{ {
// Note: All matrix uniforms are populated without transpose // Note: All matrix uniforms are populated without transpose
case GL_FLOAT_MAT4x3: case GL_FLOAT_MAT4x3:
Capture(callsOut, CaptureUniformMatrix4x3fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix4x3fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT4x2: case GL_FLOAT_MAT4x2:
Capture(callsOut, CaptureUniformMatrix4x2fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix4x2fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT4: case GL_FLOAT_MAT4:
Capture(callsOut, CaptureUniformMatrix4fv(replayState, true, uniformLoc, 1, Capture(callsOut,
false, components.data())); CaptureUniformMatrix4fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT3x4: case GL_FLOAT_MAT3x4:
Capture(callsOut, CaptureUniformMatrix3x4fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix3x4fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT3x2: case GL_FLOAT_MAT3x2:
Capture(callsOut, CaptureUniformMatrix3x2fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix3x2fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT3: case GL_FLOAT_MAT3:
Capture(callsOut, CaptureUniformMatrix3fv(replayState, true, uniformLoc, 1, Capture(callsOut,
false, components.data())); CaptureUniformMatrix3fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT2x4: case GL_FLOAT_MAT2x4:
Capture(callsOut, CaptureUniformMatrix2x4fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix2x4fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT2x3: case GL_FLOAT_MAT2x3:
Capture(callsOut, CaptureUniformMatrix2x3fv(replayState, true, uniformLoc, Capture(callsOut, CaptureUniformMatrix2x3fv(replayState, true, uniformLoc,
1, false, components.data())); uniformCount, false,
uniformBuffer.data()));
break; break;
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
Capture(callsOut, CaptureUniformMatrix2fv(replayState, true, uniformLoc, 1, Capture(callsOut,
false, components.data())); CaptureUniformMatrix2fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break; break;
case GL_FLOAT_VEC4: case GL_FLOAT_VEC4:
Capture(callsOut, CaptureUniform4fv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform4fv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case GL_FLOAT_VEC3: case GL_FLOAT_VEC3:
Capture(callsOut, CaptureUniform3fv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform3fv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case GL_FLOAT_VEC2: case GL_FLOAT_VEC2:
Capture(callsOut, CaptureUniform2fv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform2fv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case GL_FLOAT: case GL_FLOAT:
Capture(callsOut, CaptureUniform1fv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform1fv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
default: default:
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -1501,25 +1516,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState, ...@@ -1501,25 +1516,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
} }
case GL_INT: case GL_INT:
{ {
std::vector<GLint> components(typeInfo->componentCount); std::vector<GLint> uniformBuffer(uniformSize);
program->getUniformiv(context, uniformLoc, components.data()); program->getUniformiv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->componentCount) switch (typeInfo->componentCount)
{ {
case 4: case 4:
Capture(callsOut, CaptureUniform4iv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform4iv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 3: case 3:
Capture(callsOut, CaptureUniform3iv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform3iv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 2: case 2:
Capture(callsOut, CaptureUniform2iv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform2iv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 1: case 1:
Capture(callsOut, CaptureUniform1iv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform1iv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
default: default:
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -1529,25 +1544,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState, ...@@ -1529,25 +1544,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
} }
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
{ {
std::vector<GLuint> components(typeInfo->componentCount); std::vector<GLuint> uniformBuffer(uniformSize);
program->getUniformuiv(context, uniformLoc, components.data()); program->getUniformuiv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->componentCount) switch (typeInfo->componentCount)
{ {
case 4: case 4:
Capture(callsOut, CaptureUniform4uiv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform4uiv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 3: case 3:
Capture(callsOut, CaptureUniform3uiv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform3uiv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 2: case 2:
Capture(callsOut, CaptureUniform2uiv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform2uiv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
case 1: case 1:
Capture(callsOut, CaptureUniform1uiv(replayState, true, uniformLoc, 1, Capture(callsOut, CaptureUniform1uiv(replayState, true, uniformLoc,
components.data())); uniformCount, uniformBuffer.data()));
break; break;
default: default:
UNIMPLEMENTED(); UNIMPLEMENTED();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment