Commit 9f20dd77 by Jamie Madill Committed by Commit Bot

Add draw call perf test using 5 vertex arrays.

This should highlight problems with array buffer state changes even more than the single attribute test. Bug: angleproject:3014 Change-Id: I7f42ddb48f0f794fa279b81c8378dab8dc9db489 Reviewed-on: https://chromium-review.googlesource.com/c/1413788 Commit-Queue: Jamie Madill <jmadill@google.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0546b538
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "ANGLEPerfTest.h" #include "ANGLEPerfTest.h"
#include "DrawCallPerfParams.h" #include "DrawCallPerfParams.h"
#include "test_utils/draw_call_perf_utils.h" #include "test_utils/draw_call_perf_utils.h"
#include "util/shader_utils.h"
namespace namespace
{ {
...@@ -17,6 +18,7 @@ enum class StateChange ...@@ -17,6 +18,7 @@ enum class StateChange
{ {
NoChange, NoChange,
VertexBuffer, VertexBuffer,
ManyVertexBuffers,
Texture, Texture,
}; };
...@@ -40,6 +42,9 @@ std::string DrawArraysPerfParams::suffix() const ...@@ -40,6 +42,9 @@ std::string DrawArraysPerfParams::suffix() const
case StateChange::VertexBuffer: case StateChange::VertexBuffer:
strstr << "_vbo_change"; strstr << "_vbo_change";
break; break;
case StateChange::ManyVertexBuffers:
strstr << "_manyvbos_change";
break;
case StateChange::Texture: case StateChange::Texture:
strstr << "_tex_change"; strstr << "_tex_change";
break; break;
...@@ -117,6 +122,41 @@ void DrawCallPerfBenchmark::initializeBenchmark() ...@@ -117,6 +122,41 @@ void DrawCallPerfBenchmark::initializeBenchmark()
{ {
mProgram = SetupSimpleTextureProgram(); mProgram = SetupSimpleTextureProgram();
} }
else if (params.stateChange == StateChange::ManyVertexBuffers)
{
constexpr char kVS[] = R"(attribute vec2 vPosition;
attribute vec2 v0;
attribute vec2 v1;
attribute vec2 v2;
attribute vec2 v3;
const float scale = 0.5;
const float offset = -0.5;
varying vec2 v;
void main()
{
gl_Position = vec4(vPosition * vec2(scale) + vec2(offset), 0, 1);
v = (v0 + v1 + v2 + v3) * 0.25;
})";
constexpr char kFS[] = R"(precision mediump float;
varying vec2 v;
void main()
{
gl_FragColor = vec4(v, 0, 1);
})";
mProgram = CompileProgram(kVS, kFS);
glBindAttribLocation(mProgram, 1, "v0");
glBindAttribLocation(mProgram, 2, "v1");
glBindAttribLocation(mProgram, 3, "v2");
glBindAttribLocation(mProgram, 4, "v3");
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
}
else else
{ {
mProgram = SetupSimpleDrawProgram(); mProgram = SetupSimpleDrawProgram();
...@@ -124,6 +164,11 @@ void DrawCallPerfBenchmark::initializeBenchmark() ...@@ -124,6 +164,11 @@ void DrawCallPerfBenchmark::initializeBenchmark()
ASSERT_NE(0u, mProgram); ASSERT_NE(0u, mProgram);
// Re-link program to ensure the attrib bindings are used.
glBindAttribLocation(mProgram, 0, "vPosition");
glLinkProgram(mProgram);
glUseProgram(mProgram);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
mBuffer1 = Create2DTriangleBuffer(mNumTris, GL_STATIC_DRAW); mBuffer1 = Create2DTriangleBuffer(mNumTris, GL_STATIC_DRAW);
...@@ -175,19 +220,26 @@ void JustDraw(unsigned int iterations, GLsizei numElements) ...@@ -175,19 +220,26 @@ void JustDraw(unsigned int iterations, GLsizei numElements)
} }
} }
void ChangeVerticesThenDraw(unsigned int iterations, template <int kArrayBufferCount>
GLsizei numElements, void ChangeArrayBuffersThenDraw(unsigned int iterations,
GLuint buffer1, GLsizei numElements,
GLuint buffer2) GLuint buffer1,
GLuint buffer2)
{ {
for (unsigned int it = 0; it < iterations; it++) for (unsigned int it = 0; it < iterations; it++)
{ {
glBindBuffer(GL_ARRAY_BUFFER, buffer1); glBindBuffer(GL_ARRAY_BUFFER, buffer1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); for (int arrayIndex = 0; arrayIndex < kArrayBufferCount; ++arrayIndex)
{
glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, 0);
}
glDrawArrays(GL_TRIANGLES, 0, numElements); glDrawArrays(GL_TRIANGLES, 0, numElements);
glBindBuffer(GL_ARRAY_BUFFER, buffer2); glBindBuffer(GL_ARRAY_BUFFER, buffer2);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); for (int arrayIndex = 0; arrayIndex < kArrayBufferCount; ++arrayIndex)
{
glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0, 0);
}
glDrawArrays(GL_TRIANGLES, 0, numElements); glDrawArrays(GL_TRIANGLES, 0, numElements);
} }
} }
...@@ -219,7 +271,12 @@ void DrawCallPerfBenchmark::drawBenchmark() ...@@ -219,7 +271,12 @@ void DrawCallPerfBenchmark::drawBenchmark()
switch (params.stateChange) switch (params.stateChange)
{ {
case StateChange::VertexBuffer: case StateChange::VertexBuffer:
ChangeVerticesThenDraw(params.iterationsPerStep, numElements, mBuffer1, mBuffer2); ChangeArrayBuffersThenDraw<1>(params.iterationsPerStep, numElements, mBuffer1,
mBuffer2);
break;
case StateChange::ManyVertexBuffers:
ChangeArrayBuffersThenDraw<5>(params.iterationsPerStep, numElements, mBuffer1,
mBuffer2);
break; break;
case StateChange::Texture: case StateChange::Texture:
ChangeTextureThenDraw(params.iterationsPerStep, numElements, mTexture1, mTexture2); ChangeTextureThenDraw(params.iterationsPerStep, numElements, mTexture1, mTexture2);
...@@ -269,6 +326,8 @@ ANGLE_INSTANTIATE_TEST( ...@@ -269,6 +326,8 @@ ANGLE_INSTANTIATE_TEST(
DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, true), StateChange::NoChange), DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, true), StateChange::NoChange),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(false, false), StateChange::VertexBuffer), DrawArrays(DrawCallPerfOpenGLOrGLESParams(false, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, false), StateChange::VertexBuffer), DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(false, false), StateChange::ManyVertexBuffers),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, false), StateChange::ManyVertexBuffers),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(false, false), StateChange::Texture), DrawArrays(DrawCallPerfOpenGLOrGLESParams(false, false), StateChange::Texture),
DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, false), StateChange::Texture), DrawArrays(DrawCallPerfOpenGLOrGLESParams(true, false), StateChange::Texture),
DrawArrays(DrawCallPerfValidationOnly(), StateChange::NoChange), DrawArrays(DrawCallPerfValidationOnly(), StateChange::NoChange),
...@@ -276,6 +335,8 @@ ANGLE_INSTANTIATE_TEST( ...@@ -276,6 +335,8 @@ ANGLE_INSTANTIATE_TEST(
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::NoChange), DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::NoChange),
DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::VertexBuffer), DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::VertexBuffer), DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::VertexBuffer),
DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::ManyVertexBuffers),
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::ManyVertexBuffers),
DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::Texture), DrawArrays(DrawCallPerfVulkanParams(false, false), StateChange::Texture),
DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::Texture), DrawArrays(DrawCallPerfVulkanParams(true, false), StateChange::Texture),
DrawArrays(DrawCallPerfWGLParams(false), StateChange::NoChange), DrawArrays(DrawCallPerfWGLParams(false), StateChange::NoChange),
......
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