summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp')
-rwxr-xr-xgfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp b/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
new file mode 100755
index 000000000..7f182d2b1
--- /dev/null
+++ b/gfx/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp
@@ -0,0 +1,126 @@
+//
+// Copyright 2015 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// D3D11InputLayoutCacheTest:
+// Stress to to reproduce a bug where we weren't fluing the case correctly.
+//
+
+#include <sstream>
+
+#include "libANGLE/Context.h"
+#include "libANGLE/renderer/d3d/d3d11/Context11.h"
+#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
+#include "test_utils/ANGLETest.h"
+#include "test_utils/angle_test_instantiate.h"
+
+using namespace angle;
+
+namespace
+{
+
+class D3D11InputLayoutCacheTest : public ANGLETest
+{
+ protected:
+ D3D11InputLayoutCacheTest()
+ {
+ setWindowWidth(64);
+ setWindowHeight(64);
+ setConfigRedBits(8);
+ setConfigAlphaBits(8);
+ }
+
+ GLuint makeProgramWithAttribCount(unsigned int attribCount)
+ {
+ std::stringstream strstr;
+
+ strstr << "attribute vec2 position;" << std::endl;
+ for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
+ {
+ strstr << "attribute float a" << attribIndex << ";" << std::endl;
+ }
+ strstr << "varying float v;" << std::endl
+ << "void main() {" << std::endl
+ << " v = 0.0;" << std::endl;
+ for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
+ {
+ strstr << " v += a" << attribIndex << ";" << std::endl;
+ }
+ strstr << " gl_Position = vec4(position, 0.0, 1.0);" << std::endl
+ << "}" << std::endl;
+
+ const std::string basicFragmentShader =
+ "varying highp float v;\n"
+ "void main() {"
+ " gl_FragColor = vec4(v / 255.0, 0.0, 0.0, 1.0);\n"
+ "}\n";
+
+ return CompileProgram(strstr.str(), basicFragmentShader);
+ }
+};
+
+// Stress the cache by setting a small cache size and drawing with a bunch of shaders
+// with different input signatures.
+TEST_P(D3D11InputLayoutCacheTest, StressTest)
+{
+ // Hack the ANGLE!
+ gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext());
+ rx::Context11 *context11 = rx::GetImplAs<rx::Context11>(context);
+ rx::Renderer11 *renderer11 = context11->getRenderer();
+ rx::InputLayoutCache *inputLayoutCache = renderer11->getInputLayoutCache();
+
+ // Clamp the cache size to something tiny
+ inputLayoutCache->setCacheSize(4);
+
+ GLint maxAttribs = 0;
+ context->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs);
+
+ // Reserve one attrib for position
+ unsigned int maxInputs = static_cast<unsigned int>(maxAttribs) - 2;
+
+ std::vector<GLuint> programs;
+ for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount)
+ {
+ GLuint program = makeProgramWithAttribCount(attribCount);
+ ASSERT_NE(0u, program);
+ programs.push_back(program);
+ }
+
+ // Iteratively do a simple drop operation, trying every attribute count from 0..MAX_ATTRIBS.
+ // This should thrash the cache.
+ for (unsigned int iterationCount = 0; iterationCount < 10; ++iterationCount)
+ {
+ ASSERT_GL_NO_ERROR();
+
+ for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount)
+ {
+ GLuint program = programs[attribCount];
+ glUseProgram(program);
+
+ for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
+ {
+ std::stringstream attribNameStr;
+ attribNameStr << "a" << attribIndex;
+ std::string attribName = attribNameStr.str();
+
+ GLint location = glGetAttribLocation(program, attribName.c_str());
+ ASSERT_NE(-1, location);
+ glVertexAttrib1f(location, 1.0f);
+ glDisableVertexAttribArray(location);
+ }
+
+ drawQuad(program, "position", 0.5f);
+ EXPECT_PIXEL_EQ(0, 0, attribCount, 0, 0, 255u);
+ }
+ }
+
+ for (GLuint program : programs)
+ {
+ glDeleteProgram(program);
+ }
+}
+
+ANGLE_INSTANTIATE_TEST(D3D11InputLayoutCacheTest, ES2_D3D11());
+
+} // anonymous namespace