Program: Sampler uniform query in front-end.
We have this information stored in the front-end sampler bindings.
This solves sampler uniform query across the various back-ends.
Turns on a bunch of uniform_api dEQP tests.
Bug: angleproject:2612
Change-Id: If8752a26438595ad103598369df360e2f5e12d53
Reviewed-on: https://chromium-review.googlesource.com/1101572
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 5c7f031..35873db 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -1952,54 +1952,77 @@
mProgram->setUniformMatrix4x3fv(location, clampedCount, transpose, v);
}
+GLuint Program::getSamplerUniformBinding(const VariableLocation &uniformLocation) const
+{
+ GLuint samplerIndex = mState.getSamplerIndexFromUniformIndex(uniformLocation.index);
+ const std::vector<GLuint> &boundTextureUnits =
+ mState.mSamplerBindings[samplerIndex].boundTextureUnits;
+ return boundTextureUnits[uniformLocation.arrayIndex];
+}
+
void Program::getUniformfv(const Context *context, GLint location, GLfloat *v) const
{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
+ const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+ const LinkedUniform &uniform = mState.getUniforms()[uniformLocation.index];
- GLenum nativeType = gl::VariableComponentType(uniform.type);
+ if (uniform.isSampler())
+ {
+ *v = static_cast<GLfloat>(getSamplerUniformBinding(uniformLocation));
+ return;
+ }
+
+ const GLenum nativeType = gl::VariableComponentType(uniform.type);
if (nativeType == GL_FLOAT)
{
mProgram->getUniformfv(context, location, v);
}
else
{
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
+ getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
}
}
void Program::getUniformiv(const Context *context, GLint location, GLint *v) const
{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
+ const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+ const LinkedUniform &uniform = mState.getUniforms()[uniformLocation.index];
- GLenum nativeType = gl::VariableComponentType(uniform.type);
+ if (uniform.isSampler())
+ {
+ *v = static_cast<GLint>(getSamplerUniformBinding(uniformLocation));
+ return;
+ }
+
+ const GLenum nativeType = gl::VariableComponentType(uniform.type);
if (nativeType == GL_INT || nativeType == GL_BOOL)
{
mProgram->getUniformiv(context, location, v);
}
else
{
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
+ getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
}
}
void Program::getUniformuiv(const Context *context, GLint location, GLuint *v) const
{
- const auto &uniformLocation = mState.getUniformLocations()[location];
- const auto &uniform = mState.getUniforms()[uniformLocation.index];
+ const VariableLocation &uniformLocation = mState.getUniformLocations()[location];
+ const LinkedUniform &uniform = mState.getUniforms()[uniformLocation.index];
- GLenum nativeType = gl::VariableComponentType(uniform.type);
+ if (uniform.isSampler())
+ {
+ *v = getSamplerUniformBinding(uniformLocation);
+ return;
+ }
+
+ const GLenum nativeType = VariableComponentType(uniform.type);
if (nativeType == GL_UNSIGNED_INT)
{
mProgram->getUniformuiv(context, location, v);
}
else
{
- getUniformInternal(context, v, location, nativeType,
- gl::VariableComponentCount(uniform.type));
+ getUniformInternal(context, v, location, nativeType, VariableComponentCount(uniform.type));
}
}