aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2022-01-21 12:28:32 -0500
committerAngle LUCI CQ <angle-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-01-26 17:34:18 +0000
commitb2d55742b3edd74f0bc64e6ee8337689ac61e789 (patch)
treee1896319a65785e6b35fb44c2131ebf22055fa26
parent374e0c4394130947ccfefd7c00bb202c29012e27 (diff)
downloadangle-b2d55742b3edd74f0bc64e6ee8337689ac61e789.tar.gz
Program: Add generic uniform update methods.
This will make it easier to make central changes to all the update methods. Otherwise we'd have to replicate changes in each separate member. Bug: angleproject:3570 Change-Id: Ia765720507642338d6e9777b7e38fb323800359b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3407734 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
-rw-r--r--src/libANGLE/Program.cpp212
-rw-r--r--src/libANGLE/Program.h15
-rw-r--r--src/tests/gl_tests/ProgramPipelineTest.cpp92
3 files changed, 160 insertions, 159 deletions
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index bfe3177e1b..ca65550cff 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -2308,7 +2308,10 @@ bool Program::shouldIgnoreUniform(UniformLocation location) const
return false;
}
-void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLfloat *v)
+template <typename UniformT,
+ GLint UniformSize,
+ void (rx::ProgramImpl::*SetUniformFunc)(GLint, GLsizei, const UniformT *)>
+void Program::setUniformGeneric(UniformLocation location, GLsizei count, const UniformT *v)
{
ASSERT(!mLinkingState);
if (shouldIgnoreUniform(location))
@@ -2317,47 +2320,28 @@ void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLflo
}
const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v);
- mProgram->setUniform1fv(location.value, clampedCount, v);
+ GLsizei clampedCount = clampUniformCount(locationInfo, count, UniformSize, v);
+ (mProgram->*SetUniformFunc)(location.value, clampedCount, v);
}
-void Program::setUniform2fv(UniformLocation location, GLsizei count, const GLfloat *v)
+void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
+ setUniformGeneric<GLfloat, 1, &rx::ProgramImpl::setUniform1fv>(location, count, v);
+}
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2fv(location.value, clampedCount, v);
+void Program::setUniform2fv(UniformLocation location, GLsizei count, const GLfloat *v)
+{
+ setUniformGeneric<GLfloat, 2, &rx::ProgramImpl::setUniform2fv>(location, count, v);
}
void Program::setUniform3fv(UniformLocation location, GLsizei count, const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3fv(location.value, clampedCount, v);
+ setUniformGeneric<GLfloat, 3, &rx::ProgramImpl::setUniform3fv>(location, count, v);
}
void Program::setUniform4fv(UniformLocation location, GLsizei count, const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4fv(location.value, clampedCount, v);
+ setUniformGeneric<GLfloat, 4, &rx::ProgramImpl::setUniform4fv>(location, count, v);
}
void Program::setUniform1iv(Context *context,
@@ -2384,93 +2368,57 @@ void Program::setUniform1iv(Context *context,
void Program::setUniform2iv(UniformLocation location, GLsizei count, const GLint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2iv(location.value, clampedCount, v);
+ setUniformGeneric<GLint, 2, &rx::ProgramImpl::setUniform2iv>(location, count, v);
}
void Program::setUniform3iv(UniformLocation location, GLsizei count, const GLint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3iv(location.value, clampedCount, v);
+ setUniformGeneric<GLint, 3, &rx::ProgramImpl::setUniform3iv>(location, count, v);
}
void Program::setUniform4iv(UniformLocation location, GLsizei count, const GLint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4iv(location.value, clampedCount, v);
+ setUniformGeneric<GLint, 4, &rx::ProgramImpl::setUniform4iv>(location, count, v);
}
void Program::setUniform1uiv(UniformLocation location, GLsizei count, const GLuint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v);
- mProgram->setUniform1uiv(location.value, clampedCount, v);
+ setUniformGeneric<GLuint, 1, &rx::ProgramImpl::setUniform1uiv>(location, count, v);
}
void Program::setUniform2uiv(UniformLocation location, GLsizei count, const GLuint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v);
- mProgram->setUniform2uiv(location.value, clampedCount, v);
+ setUniformGeneric<GLuint, 2, &rx::ProgramImpl::setUniform2uiv>(location, count, v);
}
void Program::setUniform3uiv(UniformLocation location, GLsizei count, const GLuint *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v);
- mProgram->setUniform3uiv(location.value, clampedCount, v);
+ setUniformGeneric<GLuint, 3, &rx::ProgramImpl::setUniform3uiv>(location, count, v);
}
void Program::setUniform4uiv(UniformLocation location, GLsizei count, const GLuint *v)
{
+ setUniformGeneric<GLuint, 4, &rx::ProgramImpl::setUniform4uiv>(location, count, v);
+}
+
+template <
+ typename UniformT,
+ GLint MatrixC,
+ GLint MatrixR,
+ void (rx::ProgramImpl::*SetUniformMatrixFunc)(GLint, GLsizei, GLboolean, const UniformT *)>
+void Program::setUniformMatrixGeneric(UniformLocation location,
+ GLsizei count,
+ GLboolean transpose,
+ const UniformT *v)
+{
ASSERT(!mLinkingState);
if (shouldIgnoreUniform(location))
{
return;
}
- const VariableLocation &locationInfo = mState.mUniformLocations[location.value];
- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v);
- mProgram->setUniform4uiv(location.value, clampedCount, v);
+ GLsizei clampedCount = clampMatrixUniformCount<MatrixC, MatrixR>(location, count, transpose, v);
+ (mProgram->*SetUniformMatrixFunc)(location.value, clampedCount, transpose, v);
}
void Program::setUniformMatrix2fv(UniformLocation location,
@@ -2478,14 +2426,8 @@ void Program::setUniformMatrix2fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<2, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix2fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 2, 2, &rx::ProgramImpl::setUniformMatrix2fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix3fv(UniformLocation location,
@@ -2493,14 +2435,8 @@ void Program::setUniformMatrix3fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<3, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix3fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 3, 3, &rx::ProgramImpl::setUniformMatrix3fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix4fv(UniformLocation location,
@@ -2508,14 +2444,8 @@ void Program::setUniformMatrix4fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<4, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix4fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 4, 4, &rx::ProgramImpl::setUniformMatrix4fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix2x3fv(UniformLocation location,
@@ -2523,14 +2453,8 @@ void Program::setUniformMatrix2x3fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<2, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix2x3fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 2, 3, &rx::ProgramImpl::setUniformMatrix2x3fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix2x4fv(UniformLocation location,
@@ -2538,14 +2462,8 @@ void Program::setUniformMatrix2x4fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<2, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix2x4fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 2, 4, &rx::ProgramImpl::setUniformMatrix2x4fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix3x2fv(UniformLocation location,
@@ -2553,14 +2471,8 @@ void Program::setUniformMatrix3x2fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<3, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix3x2fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 3, 2, &rx::ProgramImpl::setUniformMatrix3x2fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix3x4fv(UniformLocation location,
@@ -2568,14 +2480,8 @@ void Program::setUniformMatrix3x4fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<3, 4>(location, count, transpose, v);
- mProgram->setUniformMatrix3x4fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 3, 4, &rx::ProgramImpl::setUniformMatrix3x4fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix4x2fv(UniformLocation location,
@@ -2583,14 +2489,8 @@ void Program::setUniformMatrix4x2fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<4, 2>(location, count, transpose, v);
- mProgram->setUniformMatrix4x2fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 4, 2, &rx::ProgramImpl::setUniformMatrix4x2fv>(location, count,
+ transpose, v);
}
void Program::setUniformMatrix4x3fv(UniformLocation location,
@@ -2598,14 +2498,8 @@ void Program::setUniformMatrix4x3fv(UniformLocation location,
GLboolean transpose,
const GLfloat *v)
{
- ASSERT(!mLinkingState);
- if (shouldIgnoreUniform(location))
- {
- return;
- }
-
- GLsizei clampedCount = clampMatrixUniformCount<4, 3>(location, count, transpose, v);
- mProgram->setUniformMatrix4x3fv(location.value, clampedCount, transpose, v);
+ setUniformMatrixGeneric<GLfloat, 4, 3, &rx::ProgramImpl::setUniformMatrix4x3fv>(location, count,
+ transpose, v);
}
GLuint Program::getSamplerUniformBinding(const VariableLocation &uniformLocation) const
diff --git a/src/libANGLE/Program.h b/src/libANGLE/Program.h
index 410b97f9f9..d35c0a86d4 100644
--- a/src/libANGLE/Program.h
+++ b/src/libANGLE/Program.h
@@ -853,6 +853,21 @@ class Program final : public LabeledObject, public angle::Subject
void postResolveLink(const gl::Context *context);
+ template <typename UniformT,
+ GLint UniformSize,
+ void (rx::ProgramImpl::*SetUniformFunc)(GLint, GLsizei, const UniformT *)>
+ void setUniformGeneric(UniformLocation location, GLsizei count, const UniformT *v);
+
+ template <
+ typename UniformT,
+ GLint MatrixC,
+ GLint MatrixR,
+ void (rx::ProgramImpl::*SetUniformMatrixFunc)(GLint, GLsizei, GLboolean, const UniformT *)>
+ void setUniformMatrixGeneric(UniformLocation location,
+ GLsizei count,
+ GLboolean transpose,
+ const UniformT *v);
+
rx::Serial mSerial;
ProgramState mState;
rx::ProgramImpl *mProgram;
diff --git a/src/tests/gl_tests/ProgramPipelineTest.cpp b/src/tests/gl_tests/ProgramPipelineTest.cpp
index 5386301c6a..8e3c036daa 100644
--- a/src/tests/gl_tests/ProgramPipelineTest.cpp
+++ b/src/tests/gl_tests/ProgramPipelineTest.cpp
@@ -824,6 +824,98 @@ void main()
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2 + 1, 0, GLColor::green);
}
+// Test that uniform updates propagate to two pipelines.
+TEST_P(ProgramPipelineTest31, UniformUpdateTwoPipelines)
+{
+ ANGLE_SKIP_TEST_IF(!IsVulkan());
+
+ // Create two separable program objects from a
+ // single source string respectively (vertSrc and fragSrc)
+ const GLchar *vertString = essl31_shaders::vs::Simple();
+ const GLchar *fragString = R"(#version 310 es
+precision highp float;
+uniform float redColorIn;
+uniform float greenColorIn;
+out vec4 my_FragColor;
+void main()
+{
+ my_FragColor = vec4(redColorIn, greenColorIn, 0.0, 1.0);
+})";
+
+ mVertProg = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vertString);
+ ASSERT_NE(mVertProg, 0u);
+ mFragProg = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragString);
+ ASSERT_NE(mFragProg, 0u);
+
+ GLint redLoc = glGetUniformLocation(mFragProg, "redColorIn");
+ ASSERT_NE(-1, redLoc);
+ GLint greenLoc = glGetUniformLocation(mFragProg, "greenColorIn");
+ ASSERT_NE(-1, greenLoc);
+
+ GLProgramPipeline ppo1;
+ glUseProgramStages(ppo1, GL_VERTEX_SHADER_BIT, mVertProg);
+ glUseProgramStages(ppo1, GL_FRAGMENT_SHADER_BIT, mFragProg);
+ glBindProgramPipeline(ppo1);
+ glActiveShaderProgram(ppo1, mFragProg);
+ ASSERT_GL_NO_ERROR();
+
+ GLProgramPipeline ppo2;
+ glUseProgramStages(ppo2, GL_VERTEX_SHADER_BIT, mVertProg);
+ glUseProgramStages(ppo2, GL_FRAGMENT_SHADER_BIT, mFragProg);
+ glBindProgramPipeline(ppo2);
+ glActiveShaderProgram(ppo2, mFragProg);
+ ASSERT_GL_NO_ERROR();
+
+ std::array<Vector3, 6> verts = GetQuadVertices();
+
+ GLBuffer vbo;
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(verts[0]), verts.data(), GL_STATIC_DRAW);
+
+ GLint posLoc = glGetAttribLocation(mVertProg, "a_position");
+ glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
+ glEnableVertexAttribArray(posLoc);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ const GLsizei w = getWindowWidth() / 2;
+ const GLsizei h = getWindowHeight() / 2;
+
+ // Set the output color to red, draw to UL quad of window with first PPO.
+ glUniform1f(redLoc, 1.0);
+ glUniform1f(greenLoc, 0.0);
+ glBindProgramPipeline(ppo1);
+ glViewport(0, 0, w, h);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ ASSERT_GL_NO_ERROR();
+
+ // Draw red to UR half of window with second PPO.
+ glBindProgramPipeline(ppo2);
+ glViewport(w, 0, w, h);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ ASSERT_GL_NO_ERROR();
+
+ // Draw green to LL corner of window with first PPO.
+ glUniform1f(redLoc, 0.0);
+ glUniform1f(greenLoc, 1.0);
+ glBindProgramPipeline(ppo1);
+ glViewport(0, h, w, h);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ ASSERT_GL_NO_ERROR();
+
+ // Draw green to LR half of window with second PPO.
+ glBindProgramPipeline(ppo2);
+ glViewport(w, h, w, h);
+ glDrawArrays(GL_TRIANGLES, 0, 6);
+ ASSERT_GL_NO_ERROR();
+
+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
+ EXPECT_PIXEL_COLOR_EQ(w + 1, 0, GLColor::red);
+ EXPECT_PIXEL_COLOR_EQ(0, h + 1, GLColor::green);
+ EXPECT_PIXEL_COLOR_EQ(w + 1, h + 1, GLColor::green);
+}
+
// Tests that setting sampler bindings on a program before the pipeline works as expected.
TEST_P(ProgramPipelineTest31, BindSamplerBeforeCreatingPipeline)
{