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,95 +1403,110 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
const gl::Program *program,
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)
if (!program->isLinked())
{
const gl::LinkedUniform &uniform = uniforms[location.index];
// We can't populate uniforms if the program hasn't been linked
return;
}
if (!program->isLinked())
{
// We can't populate uniforms if the program hasn't been linked
continue;
}
// We need to bind the program and update its uniforms
// TODO (http://anglebug.com/3662): Only bind if different from currently bound
Capture(callsOut, CaptureUseProgram(replayState, true, program->id()));
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())
{
// TODO (cnorthrop): http://anglebug.com/3662
// Add support for array uniforms
UNIMPLEMENTED();
return;
}
if (uniform.isArrayOfArrays())
{
UNIMPLEMENTED();
continue;
}
// We need to bind the program and update its uniforms
// TODO (http://anglebug.com/3662): Only bind if different from currently bound
Capture(callsOut, CaptureUseProgram(replayState, true, program->id()));
CaptureUpdateCurrentProgram(callsOut->back(), callsOut);
uniformCount = uniform.arraySizes[0];
uniformName = gl::StripLastArrayIndex(uniformName);
}
gl::UniformLocation uniformLoc = program->getUniformLocation(uniformName);
const gl::UniformTypeInfo *typeInfo = uniform.typeInfo;
gl::UniformLocation uniformLoc = {static_cast<int>(location.index)};
int uniformSize = uniformCount * typeInfo->componentCount;
switch (typeInfo->componentType)
{
case GL_FLOAT:
{
std::vector<GLfloat> components(typeInfo->componentCount);
program->getUniformfv(context, uniformLoc, components.data());
std::vector<GLfloat> uniformBuffer(uniformSize);
program->getUniformfv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->type)
{
// Note: All matrix uniforms are populated without transpose
case GL_FLOAT_MAT4x3:
Capture(callsOut, CaptureUniformMatrix4x3fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT4x2:
Capture(callsOut, CaptureUniformMatrix4x2fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT4:
Capture(callsOut, CaptureUniformMatrix4fv(replayState, true, uniformLoc, 1,
false, components.data()));
Capture(callsOut,
CaptureUniformMatrix4fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break;
case GL_FLOAT_MAT3x4:
Capture(callsOut, CaptureUniformMatrix3x4fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT3x2:
Capture(callsOut, CaptureUniformMatrix3x2fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT3:
Capture(callsOut, CaptureUniformMatrix3fv(replayState, true, uniformLoc, 1,
false, components.data()));
Capture(callsOut,
CaptureUniformMatrix3fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break;
case GL_FLOAT_MAT2x4:
Capture(callsOut, CaptureUniformMatrix2x4fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT2x3:
Capture(callsOut, CaptureUniformMatrix2x3fv(replayState, true, uniformLoc,
1, false, components.data()));
uniformCount, false,
uniformBuffer.data()));
break;
case GL_FLOAT_MAT2:
Capture(callsOut, CaptureUniformMatrix2fv(replayState, true, uniformLoc, 1,
false, components.data()));
Capture(callsOut,
CaptureUniformMatrix2fv(replayState, true, uniformLoc, uniformCount,
false, uniformBuffer.data()));
break;
case GL_FLOAT_VEC4:
Capture(callsOut, CaptureUniform4fv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform4fv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case GL_FLOAT_VEC3:
Capture(callsOut, CaptureUniform3fv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform3fv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case GL_FLOAT_VEC2:
Capture(callsOut, CaptureUniform2fv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform2fv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case GL_FLOAT:
Capture(callsOut, CaptureUniform1fv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform1fv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
default:
UNIMPLEMENTED();
......@@ -1501,25 +1516,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
}
case GL_INT:
{
std::vector<GLint> components(typeInfo->componentCount);
program->getUniformiv(context, uniformLoc, components.data());
std::vector<GLint> uniformBuffer(uniformSize);
program->getUniformiv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->componentCount)
{
case 4:
Capture(callsOut, CaptureUniform4iv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform4iv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 3:
Capture(callsOut, CaptureUniform3iv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform3iv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 2:
Capture(callsOut, CaptureUniform2iv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform2iv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 1:
Capture(callsOut, CaptureUniform1iv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform1iv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
default:
UNIMPLEMENTED();
......@@ -1529,25 +1544,25 @@ void CaptureUpdateUniformValues(const gl::State &replayState,
}
case GL_UNSIGNED_INT:
{
std::vector<GLuint> components(typeInfo->componentCount);
program->getUniformuiv(context, uniformLoc, components.data());
std::vector<GLuint> uniformBuffer(uniformSize);
program->getUniformuiv(context, uniformLoc, uniformBuffer.data());
switch (typeInfo->componentCount)
{
case 4:
Capture(callsOut, CaptureUniform4uiv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform4uiv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 3:
Capture(callsOut, CaptureUniform3uiv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform3uiv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 2:
Capture(callsOut, CaptureUniform2uiv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform2uiv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
case 1:
Capture(callsOut, CaptureUniform1uiv(replayState, true, uniformLoc, 1,
components.data()));
Capture(callsOut, CaptureUniform1uiv(replayState, true, uniformLoc,
uniformCount, uniformBuffer.data()));
break;
default:
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