| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium 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 <GLES2/gl2.h> | 5 #include <GLES2/gl2.h> |
| 6 #include <GLES2/gl2ext.h> | 6 #include <GLES2/gl2ext.h> |
| 7 #include <GLES2/gl2extchromium.h> | 7 #include <GLES2/gl2extchromium.h> |
| 8 | 8 |
| 9 #include "gpu/command_buffer/service/context_group.h" | 9 #include "gpu/command_buffer/service/context_group.h" |
| 10 #include "gpu/command_buffer/tests/gl_manager.h" | 10 #include "gpu/command_buffer/tests/gl_manager.h" |
| 11 #include "gpu/command_buffer/tests/gl_test_utils.h" | 11 #include "gpu/command_buffer/tests/gl_test_utils.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 14 |
| 15 #define SHADER(Src) #Src | 15 #define SHADER(Src) #Src |
| 16 | 16 |
| 17 namespace gpu { | 17 namespace gpu { |
| 18 | 18 |
| 19 class GLProgramTest : public testing::Test { | 19 class GLProgramTest : public testing::Test { |
| 20 protected: | 20 protected: |
| 21 void SetUp() override { gl_.Initialize(GLManager::Options()); } | 21 void SetUp() override { gl_.Initialize(GLManager::Options()); } |
| 22 | 22 |
| 23 void TearDown() override { gl_.Destroy(); } | 23 void TearDown() override { gl_.Destroy(); } |
| 24 | 24 |
| 25 GLManager gl_; | 25 GLManager gl_; |
| 26 }; | 26 }; |
| 27 | 27 |
| 28 class WebGLProgramTest : public GLProgramTest { |
| 29 protected: |
| 30 void SetUp() override { |
| 31 GLManager::Options options; |
| 32 options.webgl_version = 1; |
| 33 gl_.Initialize(options); |
| 34 } |
| 35 }; |
| 36 |
| 28 TEST_F(GLProgramTest, GetSetUniform) { | 37 TEST_F(GLProgramTest, GetSetUniform) { |
| 29 static const char* v_shader_str = SHADER( | 38 static const char* v_shader_str = SHADER( |
| 30 attribute vec4 a_vertex; | 39 attribute vec4 a_vertex; |
| 31 attribute vec3 a_normal; | 40 attribute vec3 a_normal; |
| 32 | 41 |
| 33 uniform mat4 u_modelViewProjMatrix; | 42 uniform mat4 u_modelViewProjMatrix; |
| 34 | 43 |
| 35 struct MyStruct | 44 struct MyStruct |
| 36 { | 45 { |
| 37 int x; | 46 int x; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 191 |
| 183 // We specifically don't call UseProgram again. | 192 // We specifically don't call UseProgram again. |
| 184 GLuint position_loc = glGetAttribLocation(program, "a_position"); | 193 GLuint position_loc = glGetAttribLocation(program, "a_position"); |
| 185 GLTestHelper::SetupUnitQuad(position_loc); | 194 GLTestHelper::SetupUnitQuad(position_loc); |
| 186 glDrawArrays(GL_TRIANGLES, 0, 6); | 195 glDrawArrays(GL_TRIANGLES, 0, 6); |
| 187 uint8 expected_color[] = { 0, 0, 255, 255, }; | 196 uint8 expected_color[] = { 0, 0, 255, 255, }; |
| 188 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color)); | 197 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color)); |
| 189 GLTestHelper::CheckGLError("no errors", __LINE__); | 198 GLTestHelper::CheckGLError("no errors", __LINE__); |
| 190 } | 199 } |
| 191 | 200 |
| 192 TEST_F(GLProgramTest, DeferCompileWithExt) { | 201 TEST_F(WebGLProgramTest, DeferCompileWithExt) { |
| 193 // This test must have extensions enabled. | 202 // This test must have extensions enabled. |
| 194 gles2::ContextGroup* context_group = gl_.decoder()->GetContextGroup(); | 203 gles2::ContextGroup* context_group = gl_.decoder()->GetContextGroup(); |
| 195 gles2::FeatureInfo* feature_info = context_group->feature_info(); | 204 gles2::FeatureInfo* feature_info = context_group->feature_info(); |
| 196 const gles2::FeatureInfo::FeatureFlags& flags = feature_info->feature_flags(); | 205 const gles2::FeatureInfo::FeatureFlags& flags = feature_info->feature_flags(); |
| 197 if (!flags.ext_frag_depth) | 206 if (!flags.ext_frag_depth) |
| 198 return; | 207 return; |
| 199 | 208 |
| 200 static const char* v_shdr_str = R"( | 209 static const char* v_shdr_str = R"( |
| 201 attribute vec4 vPosition; | 210 attribute vec4 vPosition; |
| 202 void main() | 211 void main() |
| 203 { | 212 { |
| 204 gl_Position = vPosition; | 213 gl_Position = vPosition; |
| 205 } | 214 } |
| 206 )"; | 215 )"; |
| 207 static const char* f_shdr_str = R"( | 216 static const char* f_shdr_str = R"( |
| 208 #extension GL_EXT_frag_depth : enable | 217 #extension GL_EXT_frag_depth : enable |
| 209 void main() | 218 void main() |
| 210 { | 219 { |
| 211 gl_FragDepthEXT = 1.0; | 220 gl_FragDepthEXT = 1.0; |
| 212 } | 221 } |
| 213 )"; | 222 )"; |
| 214 | 223 |
| 215 // First compile and link to be shader compiles. | 224 // Extension is disabled by default and be sure shader does not compile. |
| 216 GLuint vs_good = GLTestHelper::CompileShader(GL_VERTEX_SHADER, v_shdr_str); | |
| 217 GLuint fs_good = GLTestHelper::CompileShader(GL_FRAGMENT_SHADER, f_shdr_str); | |
| 218 GLuint program_good = GLTestHelper::LinkProgram(vs_good, fs_good); | |
| 219 GLint linked_good = 0; | |
| 220 glGetProgramiv(program_good, GL_LINK_STATUS, &linked_good); | |
| 221 EXPECT_NE(0, linked_good); | |
| 222 | |
| 223 // Disable extension and be sure shader no longer compiles. | |
| 224 ASSERT_TRUE(glEnableFeatureCHROMIUM("webgl_enable_glsl_webgl_validation")); | |
| 225 GLuint vs_bad = GLTestHelper::CompileShader(GL_VERTEX_SHADER, v_shdr_str); | 225 GLuint vs_bad = GLTestHelper::CompileShader(GL_VERTEX_SHADER, v_shdr_str); |
| 226 GLuint fs_bad = GLTestHelper::CompileShader(GL_FRAGMENT_SHADER, f_shdr_str); | 226 GLuint fs_bad = GLTestHelper::CompileShader(GL_FRAGMENT_SHADER, f_shdr_str); |
| 227 GLuint program_bad = GLTestHelper::LinkProgram(vs_bad, fs_bad); | 227 GLuint program_bad = GLTestHelper::LinkProgram(vs_bad, fs_bad); |
| 228 GLint linked_bad = 0; | 228 GLint linked_bad = 0; |
| 229 glGetProgramiv(program_bad, GL_LINK_STATUS, &linked_bad); | 229 glGetProgramiv(program_bad, GL_LINK_STATUS, &linked_bad); |
| 230 EXPECT_EQ(0, linked_bad); | 230 EXPECT_EQ(0, linked_bad); |
| 231 | 231 |
| 232 // Relinking good compilations without extension disabled should still link. | |
| 233 GLuint program_defer_good = GLTestHelper::LinkProgram(vs_good, fs_good); | |
| 234 GLint linked_defer_good = 0; | |
| 235 glGetProgramiv(program_defer_good, GL_LINK_STATUS, &linked_defer_good); | |
| 236 EXPECT_NE(0, linked_defer_good); | |
| 237 | |
| 238 // linking bad compilations with extension enabled should still not link. | 232 // linking bad compilations with extension enabled should still not link. |
| 239 GLuint vs_bad2 = GLTestHelper::CompileShader(GL_VERTEX_SHADER, v_shdr_str); | |
| 240 GLuint fs_bad2 = GLTestHelper::CompileShader(GL_FRAGMENT_SHADER, f_shdr_str); | |
| 241 glRequestExtensionCHROMIUM("GL_EXT_frag_depth"); | 233 glRequestExtensionCHROMIUM("GL_EXT_frag_depth"); |
| 242 GLuint program_bad2 = GLTestHelper::LinkProgram(vs_bad2, fs_bad2); | 234 program_bad = GLTestHelper::LinkProgram(vs_bad, fs_bad); |
| 243 GLint linked_bad2 = 0; | 235 linked_bad = 0; |
| 244 glGetProgramiv(program_bad2, GL_LINK_STATUS, &linked_bad2); | 236 glGetProgramiv(program_bad, GL_LINK_STATUS, &linked_bad); |
| 245 EXPECT_EQ(0, linked_bad2); | 237 EXPECT_EQ(0, linked_bad); |
| 246 | 238 |
| 247 // Be sure extension was actually turned on by recompiling. | 239 // Be sure extension was actually turned on by recompiling. |
| 248 GLuint vs_good2 = GLTestHelper::LoadShader(GL_VERTEX_SHADER, v_shdr_str); | 240 GLuint vs_good = GLTestHelper::LoadShader(GL_VERTEX_SHADER, v_shdr_str); |
| 249 GLuint fs_good2 = GLTestHelper::LoadShader(GL_FRAGMENT_SHADER, f_shdr_str); | 241 GLuint fs_good = GLTestHelper::LoadShader(GL_FRAGMENT_SHADER, f_shdr_str); |
| 250 GLuint program_good2 = GLTestHelper::SetupProgram(vs_good2, fs_good2); | 242 GLuint program_good = GLTestHelper::SetupProgram(vs_good, fs_good); |
| 251 EXPECT_NE(0u, program_good2); | 243 EXPECT_NE(0u, program_good); |
| 252 } | 244 } |
| 253 | 245 |
| 254 TEST_F(GLProgramTest, DeleteAttachedShaderLinks) { | 246 TEST_F(GLProgramTest, DeleteAttachedShaderLinks) { |
| 255 static const char* v_shdr_str = R"( | 247 static const char* v_shdr_str = R"( |
| 256 attribute vec4 vPosition; | 248 attribute vec4 vPosition; |
| 257 void main() | 249 void main() |
| 258 { | 250 { |
| 259 gl_Position = vPosition; | 251 gl_Position = vPosition; |
| 260 } | 252 } |
| 261 )"; | 253 )"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 279 | 271 |
| 280 glLinkProgram(program); | 272 glLinkProgram(program); |
| 281 | 273 |
| 282 GLint linked = 0; | 274 GLint linked = 0; |
| 283 glGetProgramiv(program, GL_LINK_STATUS, &linked); | 275 glGetProgramiv(program, GL_LINK_STATUS, &linked); |
| 284 EXPECT_NE(0, linked); | 276 EXPECT_NE(0, linked); |
| 285 } | 277 } |
| 286 | 278 |
| 287 } // namespace gpu | 279 } // namespace gpu |
| 288 | 280 |
| OLD | NEW |