Commit 3d37a374 by Shahbaz Youssefi Committed by Angle LUCI CQ

Add regression test for GL bug w.r.t cached programs

Bug: angleproject:6073 Change-Id: I22ffabea8a686e2ae615e99607cb557324c23c78 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2976185Reviewed-by: 's avatarJonah Ryan-Davis <jonahr@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent db3b4ee6
...@@ -8,6 +8,10 @@ ...@@ -8,6 +8,10 @@
// Fails in the flush thread when calling eglMakeCurrent. // Fails in the flush thread when calling eglMakeCurrent.
6063 OPENGL : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP 6063 OPENGL : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP
6063 GLES : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP 6063 GLES : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP
// Crashes in setUniformValuesFromBindingQualifiers() because mUniformRealLocationMap is not
// initialized when the program is loaded from cache.
6073 OPENGL : ProgramInterfaceTestES31.ReloadFromCacheShouldNotCrash/ES3_1_OpenGL__cached = SKIP
6073 GLES : ProgramInterfaceTestES31.ReloadFromCacheShouldNotCrash/ES3_1_OpenGLES__cached = SKIP
// Windows // Windows
3786 WIN NVIDIA D3D11 : BufferDataOverflowTest.VertexBufferIntegerOverflow/ES3_D3D11 = SKIP 3786 WIN NVIDIA D3D11 : BufferDataOverflowTest.VertexBufferIntegerOverflow/ES3_D3D11 = SKIP
......
...@@ -15,7 +15,28 @@ using namespace angle; ...@@ -15,7 +15,28 @@ using namespace angle;
namespace namespace
{ {
class ProgramInterfaceTestES31 : public ANGLETest // Variations:
//
// - bool: whether the program must be created and recreated, so that it's reloaded from cache.
using ProgramInterfaceTestParams = std::tuple<angle::PlatformParameters, bool>;
std::string ProgramInterfaceTestPrint(
const ::testing::TestParamInfo<ProgramInterfaceTestParams> &paramsInfo)
{
const ProgramInterfaceTestParams &params = paramsInfo.param;
std::ostringstream out;
out << std::get<0>(params);
if (std::get<1>(params))
{
out << "__cached";
}
return out.str();
}
class ProgramInterfaceTestES31 : public ANGLETestWithParam<ProgramInterfaceTestParams>
{ {
protected: protected:
ProgramInterfaceTestES31() ProgramInterfaceTestES31()
...@@ -27,8 +48,45 @@ class ProgramInterfaceTestES31 : public ANGLETest ...@@ -27,8 +48,45 @@ class ProgramInterfaceTestES31 : public ANGLETest
setConfigBlueBits(8); setConfigBlueBits(8);
setConfigAlphaBits(8); setConfigAlphaBits(8);
} }
void createGraphicsProgram(GLProgram &program,
const char *vs,
const char *fs,
bool cacheAndReload);
void createComputeProgram(GLProgram &program, const char *cs, bool cacheAndReload);
}; };
void ProgramInterfaceTestES31::createGraphicsProgram(GLProgram &program,
const char *vs,
const char *fs,
bool cacheAndReload)
{
program.makeRaster(vs, fs);
ASSERT_TRUE(program.valid());
if (cacheAndReload)
{
program.reset();
program.makeRaster(vs, fs);
ASSERT_TRUE(program.valid());
}
}
void ProgramInterfaceTestES31::createComputeProgram(GLProgram &program,
const char *cs,
bool cacheAndReload)
{
program.makeCompute(cs);
ASSERT_TRUE(program.valid());
if (cacheAndReload)
{
program.reset();
program.makeCompute(cs);
ASSERT_TRUE(program.valid());
}
}
// Tests glGetProgramResourceIndex. // Tests glGetProgramResourceIndex.
TEST_P(ProgramInterfaceTestES31, GetResourceIndex) TEST_P(ProgramInterfaceTestES31, GetResourceIndex)
{ {
...@@ -42,7 +100,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceIndex) ...@@ -42,7 +100,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceIndex)
" oColor = color;\n" " oColor = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS); GLProgram program;
createGraphicsProgram(program, essl31_shaders::vs::Simple(), kFS, std::get<1>(GetParam()));
GLuint index = GLuint index =
glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, essl31_shaders::PositionAttrib()); glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, essl31_shaders::PositionAttrib());
...@@ -78,7 +137,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceName) ...@@ -78,7 +137,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceName)
" oColor[0] = color;\n" " oColor[0] = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS); GLProgram program;
createGraphicsProgram(program, essl31_shaders::vs::Simple(), kFS, std::get<1>(GetParam()));
GLuint index = GLuint index =
glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, essl31_shaders::PositionAttrib()); glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, essl31_shaders::PositionAttrib());
...@@ -144,7 +204,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceLocation) ...@@ -144,7 +204,8 @@ TEST_P(ProgramInterfaceTestES31, GetResourceLocation)
" oColor[0] = color;\n" " oColor[0] = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLenum invalidInterfaces[] = {GL_UNIFORM_BLOCK, GL_TRANSFORM_FEEDBACK_VARYING, GLenum invalidInterfaces[] = {GL_UNIFORM_BLOCK, GL_TRANSFORM_FEEDBACK_VARYING,
GL_BUFFER_VARIABLE, GL_SHADER_STORAGE_BLOCK, GL_BUFFER_VARIABLE, GL_SHADER_STORAGE_BLOCK,
...@@ -204,7 +265,8 @@ TEST_P(ProgramInterfaceTestES31, GetResource) ...@@ -204,7 +265,8 @@ TEST_P(ProgramInterfaceTestES31, GetResource)
" oColor[0] = color;\n" " oColor[0] = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, "position"); GLuint index = glGetProgramResourceIndex(program, GL_PROGRAM_INPUT, "position");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -283,7 +345,8 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface) ...@@ -283,7 +345,8 @@ TEST_P(ProgramInterfaceTestES31, GetProgramInterface)
" blockInstance2[0].target = vec3(1, 1, 1);\n" " blockInstance2[0].target = vec3(1, 1, 1);\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, essl31_shaders::vs::Simple(), kFS); GLProgram program;
createGraphicsProgram(program, essl31_shaders::vs::Simple(), kFS, std::get<1>(GetParam()));
GLint num; GLint num;
glGetProgramInterfaceiv(program, GL_PROGRAM_INPUT, GL_ACTIVE_RESOURCES, &num); glGetProgramInterfaceiv(program, GL_PROGRAM_INPUT, GL_ACTIVE_RESOURCES, &num);
...@@ -373,7 +436,8 @@ TEST_P(ProgramInterfaceTestES31, GetUniformProperties) ...@@ -373,7 +436,8 @@ TEST_P(ProgramInterfaceTestES31, GetUniformProperties)
" oColor = color;\n" " oColor = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM, "color"); GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM, "color");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -480,7 +544,8 @@ TEST_P(ProgramInterfaceTestES31, GetUniformBlockProperties) ...@@ -480,7 +544,8 @@ TEST_P(ProgramInterfaceTestES31, GetUniformBlockProperties)
" color = vec4(v, 0, 1);\n" " color = vec4(v, 0, 1);\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM_BLOCK, "blockName"); GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM_BLOCK, "blockName");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -572,7 +637,9 @@ TEST_P(ProgramInterfaceTestES31, QueryAtomicCounteBuffer) ...@@ -572,7 +637,9 @@ TEST_P(ProgramInterfaceTestES31, QueryAtomicCounteBuffer)
" my_color = vec4(0.0);\n" " my_color = vec4(0.0);\n"
"}\n"; "}\n";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLint num; GLint num;
glGetProgramInterfaceiv(program, GL_ATOMIC_COUNTER_BUFFER, GL_ACTIVE_RESOURCES, &num); glGetProgramInterfaceiv(program, GL_ATOMIC_COUNTER_BUFFER, GL_ACTIVE_RESOURCES, &num);
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -646,7 +713,8 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties) ...@@ -646,7 +713,8 @@ TEST_P(ProgramInterfaceTestES31, GetBufferVariableProperties)
" oColor = vec4(instanceName1[0].f1, 0, 0, 1);\n" " oColor = vec4(instanceName1[0].f1, 0, 0, 1);\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockName1.f1"); GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockName1.f1");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -761,7 +829,8 @@ void main() ...@@ -761,7 +829,8 @@ void main()
} }
)"; )";
ANGLE_GL_COMPUTE_PROGRAM(program, kComputeShaderSource); GLProgram program;
createComputeProgram(program, kComputeShaderSource, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockIn.a"); GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockIn.a");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -874,7 +943,8 @@ void main() ...@@ -874,7 +943,8 @@ void main()
} }
)"; )";
ANGLE_GL_COMPUTE_PROGRAM(program, kComputeShaderSource); GLProgram program;
createComputeProgram(program, kComputeShaderSource, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockOut.s[0][0].m"); GLuint index = glGetProgramResourceIndex(program, GL_BUFFER_VARIABLE, "blockOut.s[0][0].m");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -1002,7 +1072,8 @@ TEST_P(ProgramInterfaceTestES31, GetShaderStorageBlockProperties) ...@@ -1002,7 +1072,8 @@ TEST_P(ProgramInterfaceTestES31, GetShaderStorageBlockProperties)
" oColor = color;\n" " oColor = color;\n"
"}"; "}";
ANGLE_GL_PROGRAM(program, kVS, kFS); GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, "blockName0"); GLuint index = glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, "blockName0");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -1072,7 +1143,8 @@ void main() ...@@ -1072,7 +1143,8 @@ void main()
atomicCounterIncrement(ac2); atomicCounterIncrement(ac2);
})"; })";
ANGLE_GL_COMPUTE_PROGRAM(program, kCSSource); GLProgram program;
createComputeProgram(program, kCSSource, std::get<1>(GetParam()));
GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM, "ac"); GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM, "ac");
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
...@@ -1217,7 +1289,64 @@ void main() { ...@@ -1217,7 +1289,64 @@ void main() {
glDeleteProgram(program); glDeleteProgram(program);
} }
// Regression test for crash report in http://anglebug.com/6073.
TEST_P(ProgramInterfaceTestES31, ReloadFromCacheShouldNotCrash)
{
// TODO(jiajia.qin@intel.com): Don't skip this test once non-simple SSBO sentences are supported
// on d3d backend. http://anglebug.com/1951
ANGLE_SKIP_TEST_IF(IsD3D11());
constexpr char kVS[] = R"(#version 310 es
#extension GL_ANGLE_multi_draw : require
precision highp int;
precision highp float;
layout(std140) buffer;
struct TransformInfo
{
mat4 mvp;
};
layout(binding = 0) buffer pe_transforms
{
TransformInfo transforms[];
};
out vec2 texCoord;
uniform int pe_base_draw_id;
layout(location = 0) in vec3 pe_vertex;
layout(location = 1) in vec3 pe_normal;
layout(location = 2) in vec2 pe_tex_coord;
void main()
{
vec4 v = vec4(pe_vertex, 1.0);
texCoord = pe_tex_coord;
gl_Position = transforms[(gl_DrawID + pe_base_draw_id)].mvp * v;
})";
constexpr char kFS[] = R"(#version 310 es
#extension GL_ANGLE_multi_draw : require
precision highp int;
precision highp float;
layout(std140) buffer;
in vec2 texCoord;
layout(binding = 0) uniform sampler2D pe_tex_main;
out vec4 pe_frag_color;
void main()
{
vec4 u = texture(pe_tex_main, texCoord);
if(u.a < 0.05)
discard;
pe_frag_color = u;
}
)";
GLProgram program;
createGraphicsProgram(program, kVS, kFS, std::get<1>(GetParam()));
EXPECT_GL_NO_ERROR();
}
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramInterfaceTestES31); GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramInterfaceTestES31);
ANGLE_INSTANTIATE_TEST_ES31(ProgramInterfaceTestES31); ANGLE_INSTANTIATE_TEST_COMBINE_1(ProgramInterfaceTestES31,
ProgramInterfaceTestPrint,
testing::Bool(),
ANGLE_ALL_TEST_PLATFORMS_ES31);
} // anonymous namespace } // anonymous namespace
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