Commit 94ae660d by Luc Ferron Committed by Commit Bot

Vulkan: Create tests to validate we created the pipeline when needed

1- Link program with a shader and draw with it, relink with another shader and draw again. 2- Release program that is reading from a uniform. Bug: angleproject:2397 Change-Id: Icb4211c5cf71efaf41833d9d5afd83ce8410c598 Reviewed-on: https://chromium-review.googlesource.com/1028580 Commit-Queue: Luc Ferron <lucferron@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent ad3aaeba
......@@ -530,7 +530,6 @@ void ContextVk::syncState(const gl::Context *context, const gl::State::DirtyBits
WARN() << "DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING unimplemented";
break;
case gl::State::DIRTY_BIT_PROGRAM_BINDING:
WARN() << "DIRTY_BIT_PROGRAM_BINDING unimplemented";
break;
case gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE:
{
......
......@@ -1931,6 +1931,104 @@ void main() {
EXPECT_PIXEL_RECT_EQ(0, 0, kBigTextureSize, kBigTextureSize, GLColor::green);
}
// Tries to relink a program in use and use it again to draw something else.
TEST_P(SimpleStateChangeTest, RelinkProgram)
{
const GLuint program = glCreateProgram();
GLuint vs = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Simple());
GLuint blueFs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::Blue());
GLuint redFs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::Red());
glAttachShader(program, vs);
glAttachShader(program, blueFs);
glLinkProgram(program);
CheckLinkStatusAndReturnProgram(program, true);
glClear(GL_COLOR_BUFFER_BIT);
std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f},
{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {-1.0, 1.0f, 0.0f}};
GLBuffer vertexBuffer;
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
GL_STATIC_DRAW);
const GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
ASSERT_NE(-1, positionLocation);
glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(positionLocation);
// Draw a blue triangle to the right
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3);
// Relink to draw red to the left
glDetachShader(program, blueFs);
glAttachShader(program, redFs);
glLinkProgram(program);
CheckLinkStatusAndReturnProgram(program, true);
glDrawArrays(GL_TRIANGLES, 3, 3);
ASSERT_GL_NO_ERROR();
glDisableVertexAttribArray(positionLocation);
// Verify we drew red and green in the right places.
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::blue);
EXPECT_PIXEL_COLOR_EQ(0, getWindowHeight() / 2, GLColor::red);
glDeleteShader(vs);
glDeleteShader(blueFs);
glDeleteShader(redFs);
glDeleteProgram(program);
}
// Creates a program that uses uniforms and then immediately release it and then use it. Should be
// valid.
TEST_P(SimpleStateChangeTest, ReleaseShaderInUseThatReadsFromUniforms)
{
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
glUseProgram(program);
const GLint uniformLoc = glGetUniformLocation(program, essl1_shaders::ColorUniform());
EXPECT_NE(-1, uniformLoc);
// Set color to red.
glUniform4f(uniformLoc, 1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}};
GLBuffer vertexBuffer;
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
GL_STATIC_DRAW);
const GLint positionLocation = glGetAttribLocation(program, essl1_shaders::PositionAttrib());
ASSERT_NE(-1, positionLocation);
glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(positionLocation);
// Release program while its in use.
glDeleteProgram(program);
// Draw a red triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
// Set color to green
glUniform4f(uniformLoc, 1.0f, 0.0f, 0.0f, 1.0f);
// Draw a green triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
ASSERT_GL_NO_ERROR();
glDisableVertexAttribArray(positionLocation);
// Verify we drew red in the end since thats the last draw.
EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, 0, GLColor::red);
}
} // anonymous namespace
ANGLE_INSTANTIATE_TEST(StateChangeTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL());
......
......@@ -18,6 +18,7 @@
#include <string>
#include <vector>
ANGLE_EXPORT GLuint CheckLinkStatusAndReturnProgram(GLuint program, bool outputErrorMessages);
ANGLE_EXPORT GLuint CompileShader(GLenum type, const std::string &source);
ANGLE_EXPORT GLuint CompileShaderFromFile(GLenum type, const std::string &sourcePath);
......
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