OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/logging.h" | 5 #include "base/logging.h" |
6 #include "main.h" | 6 #include "main.h" |
7 #include "testbase.h" | 7 #include "testbase.h" |
8 #include "utils.h" | 8 #include "utils.h" |
9 | 9 |
10 namespace glbench { | 10 namespace glbench { |
11 | 11 |
12 | 12 |
13 class FillRateTest : public DrawArraysTestFunc { | 13 class FillRateTest : public DrawArraysTestFunc { |
14 public: | 14 public: |
15 FillRateTest() {} | 15 FillRateTest() {} |
16 virtual ~FillRateTest() {} | 16 virtual ~FillRateTest() {} |
17 virtual bool Run(); | 17 virtual bool Run(); |
18 virtual const char* Name() const { return "fill_rate"; } | 18 virtual const char* Name() const { return "fill_rate"; } |
19 | 19 |
20 private: | 20 private: |
21 DISALLOW_COPY_AND_ASSIGN(FillRateTest); | 21 DISALLOW_COPY_AND_ASSIGN(FillRateTest); |
22 }; | 22 }; |
23 | 23 |
| 24 #if defined(I915_WORKAROUND) |
| 25 #define V1 "gl_TexCoord[0]" |
| 26 #else |
| 27 #define V1 "v1" |
| 28 #endif |
| 29 |
| 30 const char* kVertexShader1 = |
| 31 "attribute vec4 position;" |
| 32 "void main() {" |
| 33 " gl_Position = position;" |
| 34 "}"; |
| 35 |
| 36 const char* kFragmentShader1 = |
| 37 "uniform vec4 color;" |
| 38 "void main() {" |
| 39 " gl_FragColor = color;" |
| 40 "}"; |
| 41 |
| 42 |
| 43 const char* kVertexShader2 = |
| 44 "attribute vec4 position;" |
| 45 "attribute vec4 texcoord;" |
| 46 "uniform float scale;" |
| 47 "varying vec2 v1;" |
| 48 "void main() {" |
| 49 " gl_Position = position * vec4(scale, scale, 1., 1.);" |
| 50 " " V1 " = texcoord;" |
| 51 "}"; |
| 52 |
| 53 const char* kFragmentShader2 = |
| 54 "uniform sampler2D texture;" |
| 55 "varying vec2 v1;" |
| 56 "void main() {" |
| 57 " gl_FragColor = texture2D(texture, " V1 ".xy);" |
| 58 "}"; |
24 | 59 |
25 bool FillRateTest::Run() { | 60 bool FillRateTest::Run() { |
26 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); | 61 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); |
27 glDisable(GL_DEPTH_TEST); | 62 glDisable(GL_DEPTH_TEST); |
28 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 63 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
29 | 64 |
30 GLfloat buffer_vertex[8] = { | 65 GLfloat buffer_vertex[8] = { |
31 -1.f, -1.f, | 66 -1.f, -1.f, |
32 1.f, -1.f, | 67 1.f, -1.f, |
33 -1.f, 1.f, | 68 -1.f, 1.f, |
34 1.f, 1.f, | 69 1.f, 1.f, |
35 }; | 70 }; |
36 GLfloat buffer_texture[8] = { | 71 GLfloat buffer_texture[8] = { |
37 0.f, 0.f, | 72 0.f, 0.f, |
38 1.f, 0.f, | 73 1.f, 0.f, |
39 0.f, 1.f, | 74 0.f, 1.f, |
40 1.f, 1.f, | 75 1.f, 1.f, |
41 }; | 76 }; |
42 glEnableClientState(GL_VERTEX_ARRAY); | |
43 | 77 |
44 GLuint vbo_vertex = SetupVBO(GL_ARRAY_BUFFER, | 78 GLuint vbo_vertex = SetupVBO(GL_ARRAY_BUFFER, |
45 sizeof(buffer_vertex), buffer_vertex); | 79 sizeof(buffer_vertex), buffer_vertex); |
46 glVertexPointer(2, GL_FLOAT, 0, 0); | 80 GLuint program = InitShaderProgram(kVertexShader1, kFragmentShader1); |
| 81 GLint position_attribute = glGetAttribLocation(program, "position"); |
| 82 glVertexAttribPointer(position_attribute, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
| 83 glEnableVertexAttribArray(position_attribute); |
| 84 |
| 85 GLint color_uniform = glGetUniformLocation(program, "color"); |
| 86 const GLfloat red[4] = {1.f, 0.f, 0.f, 1.f}; |
| 87 glUniform4fv(color_uniform, 1, red); |
| 88 |
| 89 FillRateTestNormal("fill_solid"); |
| 90 FillRateTestBlendDepth("fill_solid"); |
| 91 |
| 92 glDeleteProgram(program); |
| 93 |
| 94 program = InitShaderProgram(kVertexShader2, kFragmentShader2); |
| 95 position_attribute = glGetAttribLocation(program, "position"); |
| 96 // Reusing vbo_vertex buffer from the previous test. |
| 97 glVertexAttribPointer(position_attribute, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
| 98 glEnableVertexAttribArray(position_attribute); |
47 | 99 |
48 GLuint vbo_texture = SetupVBO(GL_ARRAY_BUFFER, | 100 GLuint vbo_texture = SetupVBO(GL_ARRAY_BUFFER, |
49 sizeof(buffer_texture), buffer_texture); | 101 sizeof(buffer_texture), buffer_texture); |
50 glTexCoordPointer(2, GL_FLOAT, 0, 0); | 102 GLuint texcoord_attribute = glGetAttribLocation(program, "texcoord"); |
51 | 103 glVertexAttribPointer(texcoord_attribute, 2, GL_FLOAT, GL_FALSE, 0, NULL); |
52 glColor4f(1.f, 0.f, 0.f, 1.f); | 104 glEnableVertexAttribArray(texcoord_attribute); |
53 FillRateTestNormal("fill_solid"); | |
54 FillRateTestBlendDepth("fill_solid"); | |
55 | |
56 glColor4f(1.f, 1.f, 1.f, 1.f); | |
57 glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |
58 glEnable(GL_TEXTURE_2D); | |
59 | 105 |
60 GLuint texture = SetupTexture(9); | 106 GLuint texture = SetupTexture(9); |
| 107 |
| 108 GLuint texture_uniform = glGetUniformLocation(program, "texture"); |
| 109 glUniform1i(texture_uniform, 0); |
| 110 |
| 111 GLuint scale_uinform = glGetUniformLocation(program, "scale"); |
| 112 glUniform1f(scale_uinform, 1.f); |
| 113 |
61 FillRateTestNormal("fill_tex_nearest"); | 114 FillRateTestNormal("fill_tex_nearest"); |
62 | 115 |
63 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); |
64 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); |
65 FillRateTestNormal("fill_tex_bilinear"); | 118 FillRateTestNormal("fill_tex_bilinear"); |
66 | 119 |
67 // lod = 0.5 | 120 // lod = 0.5 |
68 glScalef(0.7071f, 0.7071f, 1.f); | 121 glUniform1f(scale_uinform, 0.7071f); |
69 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, | 122 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
70 GL_LINEAR_MIPMAP_NEAREST); | 123 GL_LINEAR_MIPMAP_NEAREST); |
71 FillRateTestNormalSubWindow("fill_tex_trilinear_nearest_05", | 124 FillRateTestNormalSubWindow("fill_tex_trilinear_nearest_05", |
72 0.7071f * g_width, 0.7071f * g_height); | 125 0.7071f * g_width, 0.7071f * g_height); |
73 | 126 |
74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, | 127 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
75 GL_LINEAR_MIPMAP_LINEAR); | 128 GL_LINEAR_MIPMAP_LINEAR); |
76 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_05", | 129 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_05", |
77 0.7071f * g_width, 0.7071f * g_height); | 130 0.7071f * g_width, 0.7071f * g_height); |
78 | 131 |
79 // lod = 0.4 | 132 // lod = 0.4 |
80 glLoadIdentity(); | 133 glUniform1f(scale_uinform, 0.758f); |
81 glScalef(0.758f, 0.758f, 1.f); | |
82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, | 134 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
83 GL_LINEAR_MIPMAP_LINEAR); | 135 GL_LINEAR_MIPMAP_LINEAR); |
84 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_04", | 136 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_04", |
85 0.758f * g_width, 0.758f * g_height); | 137 0.758f * g_width, 0.758f * g_height); |
86 | 138 |
87 // lod = 0.1 | 139 // lod = 0.1 |
88 glLoadIdentity(); | 140 glUniform1f(scale_uinform, 0.933f); |
89 glScalef(0.933f, 0.933f, 1.f); | |
90 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, | 141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
91 GL_LINEAR_MIPMAP_LINEAR); | 142 GL_LINEAR_MIPMAP_LINEAR); |
92 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_01", | 143 FillRateTestNormalSubWindow("fill_tex_trilinear_linear_01", |
93 0.933f * g_width, 0.933f * g_height); | 144 0.933f * g_width, 0.933f * g_height); |
94 | 145 |
| 146 glDeleteProgram(program); |
95 glDeleteBuffers(1, &vbo_vertex); | 147 glDeleteBuffers(1, &vbo_vertex); |
96 glDeleteBuffers(1, &vbo_texture); | 148 glDeleteBuffers(1, &vbo_texture); |
97 glDeleteTextures(1, &texture); | 149 glDeleteTextures(1, &texture); |
98 | 150 |
99 return true; | 151 return true; |
100 } | 152 } |
101 | 153 |
102 TestBase* GetFillRateTest() { | 154 TestBase* GetFillRateTest() { |
103 return new FillRateTest; | 155 return new FillRateTest; |
104 } | 156 } |
105 | 157 |
106 } // namespace glbench | 158 } // namespace glbench |
OLD | NEW |