xref: /aosp_15_r20/external/angle/src/tests/gl_tests/D3D11InputLayoutCacheTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // D3D11InputLayoutCacheTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Stress to to reproduce a bug where we weren't flushing the case correctly.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <sstream>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/d3d11/Context11.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/angle_test_instantiate.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker class D3D11InputLayoutCacheTest : public ANGLETest<>
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker   protected:
D3D11InputLayoutCacheTest()28*8975f5c5SAndroid Build Coastguard Worker     D3D11InputLayoutCacheTest()
29*8975f5c5SAndroid Build Coastguard Worker     {
30*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(64);
31*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(64);
32*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
33*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
34*8975f5c5SAndroid Build Coastguard Worker     }
35*8975f5c5SAndroid Build Coastguard Worker 
makeProgramWithAttribCount(unsigned int attribCount)36*8975f5c5SAndroid Build Coastguard Worker     GLuint makeProgramWithAttribCount(unsigned int attribCount)
37*8975f5c5SAndroid Build Coastguard Worker     {
38*8975f5c5SAndroid Build Coastguard Worker         std::stringstream strstr;
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker         strstr << "attribute vec2 position;" << std::endl;
41*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
42*8975f5c5SAndroid Build Coastguard Worker         {
43*8975f5c5SAndroid Build Coastguard Worker             strstr << "attribute float a" << attribIndex << ";" << std::endl;
44*8975f5c5SAndroid Build Coastguard Worker         }
45*8975f5c5SAndroid Build Coastguard Worker         strstr << "varying float v;" << std::endl
46*8975f5c5SAndroid Build Coastguard Worker                << "void main() {" << std::endl
47*8975f5c5SAndroid Build Coastguard Worker                << "    v = 0.0;" << std::endl;
48*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
49*8975f5c5SAndroid Build Coastguard Worker         {
50*8975f5c5SAndroid Build Coastguard Worker             strstr << "    v += a" << attribIndex << ";" << std::endl;
51*8975f5c5SAndroid Build Coastguard Worker         }
52*8975f5c5SAndroid Build Coastguard Worker         strstr << "    gl_Position = vec4(position, 0.0, 1.0);" << std::endl << "}" << std::endl;
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] =
55*8975f5c5SAndroid Build Coastguard Worker             "varying highp float v;\n"
56*8975f5c5SAndroid Build Coastguard Worker             "void main() {"
57*8975f5c5SAndroid Build Coastguard Worker             "   gl_FragColor = vec4(v / 255.0, 0.0, 0.0, 1.0);\n"
58*8975f5c5SAndroid Build Coastguard Worker             "}\n";
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker         return CompileProgram(strstr.str().c_str(), kFS);
61*8975f5c5SAndroid Build Coastguard Worker     }
62*8975f5c5SAndroid Build Coastguard Worker };
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker // Stress the cache by setting a small cache size and drawing with a bunch of shaders
65*8975f5c5SAndroid Build Coastguard Worker // with different input signatures.
TEST_P(D3D11InputLayoutCacheTest,StressTest)66*8975f5c5SAndroid Build Coastguard Worker TEST_P(D3D11InputLayoutCacheTest, StressTest)
67*8975f5c5SAndroid Build Coastguard Worker {
68*8975f5c5SAndroid Build Coastguard Worker     // Hack the ANGLE!
69*8975f5c5SAndroid Build Coastguard Worker     egl::Display *display   = static_cast<egl::Display *>(getEGLWindow()->getDisplay());
70*8975f5c5SAndroid Build Coastguard Worker     gl::ContextID contextID = {
71*8975f5c5SAndroid Build Coastguard Worker         static_cast<GLuint>(reinterpret_cast<uintptr_t>(getEGLWindow()->getContext()))};
72*8975f5c5SAndroid Build Coastguard Worker     gl::Context *context                   = display->getContext(contextID);
73*8975f5c5SAndroid Build Coastguard Worker     rx::Context11 *context11               = rx::GetImplAs<rx::Context11>(context);
74*8975f5c5SAndroid Build Coastguard Worker     rx::Renderer11 *renderer11             = context11->getRenderer();
75*8975f5c5SAndroid Build Coastguard Worker     rx::InputLayoutCache *inputLayoutCache = renderer11->getStateManager()->getInputLayoutCache();
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     // Clamp the cache size to something tiny
78*8975f5c5SAndroid Build Coastguard Worker     inputLayoutCache->setCacheSize(4);
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     GLint maxAttribs = 0;
81*8975f5c5SAndroid Build Coastguard Worker     context->getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs);
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     // Reserve one attrib for position
84*8975f5c5SAndroid Build Coastguard Worker     unsigned int maxInputs = static_cast<unsigned int>(maxAttribs) - 2;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLuint> programs;
87*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount)
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         GLuint program = makeProgramWithAttribCount(attribCount);
90*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, program);
91*8975f5c5SAndroid Build Coastguard Worker         programs.push_back(program);
92*8975f5c5SAndroid Build Coastguard Worker     }
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     // Iteratively do a simple drop operation, trying every attribute count from 0..MAX_ATTRIBS.
95*8975f5c5SAndroid Build Coastguard Worker     // This should thrash the cache.
96*8975f5c5SAndroid Build Coastguard Worker     for (unsigned int iterationCount = 0; iterationCount < 10; ++iterationCount)
97*8975f5c5SAndroid Build Coastguard Worker     {
98*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker         for (unsigned int attribCount = 0; attribCount <= maxInputs; ++attribCount)
101*8975f5c5SAndroid Build Coastguard Worker         {
102*8975f5c5SAndroid Build Coastguard Worker             GLuint program = programs[attribCount];
103*8975f5c5SAndroid Build Coastguard Worker             glUseProgram(program);
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker             for (unsigned int attribIndex = 0; attribIndex < attribCount; ++attribIndex)
106*8975f5c5SAndroid Build Coastguard Worker             {
107*8975f5c5SAndroid Build Coastguard Worker                 std::stringstream attribNameStr;
108*8975f5c5SAndroid Build Coastguard Worker                 attribNameStr << "a" << attribIndex;
109*8975f5c5SAndroid Build Coastguard Worker                 std::string attribName = attribNameStr.str();
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker                 GLint location = glGetAttribLocation(program, attribName.c_str());
112*8975f5c5SAndroid Build Coastguard Worker                 ASSERT_NE(-1, location);
113*8975f5c5SAndroid Build Coastguard Worker                 glVertexAttrib1f(location, 1.0f);
114*8975f5c5SAndroid Build Coastguard Worker                 glDisableVertexAttribArray(location);
115*8975f5c5SAndroid Build Coastguard Worker             }
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker             drawQuad(program, "position", 0.5f);
118*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_EQ(0, 0, attribCount, 0, 0, 255u);
119*8975f5c5SAndroid Build Coastguard Worker         }
120*8975f5c5SAndroid Build Coastguard Worker     }
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker     for (GLuint program : programs)
123*8975f5c5SAndroid Build Coastguard Worker     {
124*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(program);
125*8975f5c5SAndroid Build Coastguard Worker     }
126*8975f5c5SAndroid Build Coastguard Worker }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(D3D11InputLayoutCacheTest, ES2_D3D11(), ES3_D3D11(), ES31_D3D11());
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
131