Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef GL_GLEXT_PROTOTYPES | 5 #ifndef GL_GLEXT_PROTOTYPES |
| 6 #define GL_GLEXT_PROTOTYPES | 6 #define GL_GLEXT_PROTOTYPES |
| 7 #endif | 7 #endif |
| 8 | 8 |
| 9 #include <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
| 10 #include <GLES2/gl2ext.h> | 10 #include <GLES2/gl2ext.h> |
| 11 #include <GLES2/gl2extchromium.h> | 11 #include <GLES2/gl2extchromium.h> |
| 12 #include <GLES3/gl3.h> | 12 #include <GLES3/gl3.h> |
| 13 #include <stddef.h> | 13 #include <stddef.h> |
| 14 #include <stdint.h> | 14 #include <stdint.h> |
| 15 | 15 |
| 16 #include "base/command_line.h" | |
| 17 #include "base/strings/string_number_conversions.h" | |
| 16 #include "gpu/command_buffer/tests/gl_manager.h" | 18 #include "gpu/command_buffer/tests/gl_manager.h" |
| 17 #include "gpu/command_buffer/tests/gl_test_utils.h" | 19 #include "gpu/command_buffer/tests/gl_test_utils.h" |
| 20 #include "gpu/config/gpu_switches.h" | |
| 18 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "ui/gl/gl_version_info.h" | 23 #include "ui/gl/gl_version_info.h" |
| 21 | 24 |
| 22 namespace gpu { | 25 namespace gpu { |
| 23 | 26 |
| 24 namespace { | 27 namespace { |
| 25 | 28 |
| 26 enum CopyType { TexImage, TexSubImage }; | 29 enum CopyType { TexImage, TexSubImage }; |
| 27 const CopyType kCopyTypes[] = { | 30 const CopyType kCopyTypes[] = { |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 45 | 48 |
| 46 static const char* kSimpleVertexShaderES3 = | 49 static const char* kSimpleVertexShaderES3 = |
| 47 "#version 300 es\n" | 50 "#version 300 es\n" |
| 48 "in vec2 a_position;\n" | 51 "in vec2 a_position;\n" |
| 49 "out vec2 v_texCoord;\n" | 52 "out vec2 v_texCoord;\n" |
| 50 "void main() {\n" | 53 "void main() {\n" |
| 51 " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n" | 54 " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n" |
| 52 " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n" | 55 " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n" |
| 53 "}\n"; | 56 "}\n"; |
| 54 | 57 |
| 55 std::string GetFragmentShaderSource(GLenum format, bool is_es3) { | 58 std::string GetFragmentShaderSource(GLenum target, GLenum format, bool is_es3) { |
| 56 std::string source; | 59 std::string source; |
| 57 if (is_es3) { | 60 if (is_es3) { |
| 58 source += | 61 source += |
| 59 "#version 300 es\n" | 62 "#version 300 es\n" |
| 60 "#define VARYING in\n" | 63 "#define VARYING in\n" |
| 61 "#define FRAGCOLOR frag_color\n" | 64 "#define FRAGCOLOR frag_color\n" |
| 62 "#define TextureLookup texture\n"; | 65 "#define TextureLookup texture\n"; |
| 63 } else { | 66 } else { |
| 64 source += | 67 source += |
| 65 "#define VARYING varying\n" | 68 "#define VARYING varying\n" |
| 66 "#define FRAGCOLOR gl_FragColor\n" | 69 "#define FRAGCOLOR gl_FragColor\n"; |
| 67 "#define TextureLookup texture2D\n"; | 70 if (target == GL_TEXTURE_CUBE_MAP) { |
| 71 source += "#define TextureLookup textureCube\n"; | |
| 72 } else { | |
| 73 source += "#define TextureLookup texture2D\n"; | |
| 74 } | |
| 68 } | 75 } |
| 69 source += "precision mediump float;\n"; | 76 source += "precision mediump float;\n"; |
| 70 | 77 |
| 71 if (gles2::GLES2Util::IsSignedIntegerFormat(format)) { | 78 if (gles2::GLES2Util::IsSignedIntegerFormat(format)) { |
| 72 source += std::string("#define SamplerType isampler2D\n"); | 79 if (target == GL_TEXTURE_CUBE_MAP) { |
| 73 source += std::string("#define TextureType ivec4\n"); | 80 source += "#define SamplerType isamplerCube\n"; |
| 74 source += std::string("#define ScaleValue 255.0\n"); | 81 } else { |
| 82 source += "#define SamplerType isampler2D\n"; | |
| 83 } | |
| 84 source += "#define TextureType ivec4\n"; | |
| 85 source += "#define ScaleValue 255.0\n"; | |
| 75 } else if (gles2::GLES2Util::IsUnsignedIntegerFormat(format)) { | 86 } else if (gles2::GLES2Util::IsUnsignedIntegerFormat(format)) { |
| 76 source += std::string("#define SamplerType usampler2D\n"); | 87 if (target == GL_TEXTURE_CUBE_MAP) { |
| 77 source += std::string("#define TextureType uvec4\n"); | 88 source += "#define SamplerType usamplerCube\n"; |
| 78 source += std::string("#define ScaleValue 255.0\n"); | 89 } else { |
| 90 source += "#define SamplerType usampler2D\n"; | |
| 91 } | |
| 92 source += "#define TextureType uvec4\n"; | |
| 93 source += "#define ScaleValue 255.0\n"; | |
| 79 } else { | 94 } else { |
| 80 source += std::string("#define SamplerType sampler2D\n"); | 95 if (target == GL_TEXTURE_CUBE_MAP) { |
| 81 source += std::string("#define TextureType vec4\n"); | 96 source += "#define SamplerType samplerCube\n"; |
| 82 source += std::string("#define ScaleValue 1.0\n"); | 97 } else { |
| 98 source += "#define SamplerType sampler2D\n"; | |
| 99 } | |
| 100 source += "#define TextureType vec4\n"; | |
| 101 source += "#define ScaleValue 1.0\n"; | |
| 83 } | 102 } |
| 84 | 103 |
| 85 if (is_es3) | 104 if (is_es3) |
| 86 source += "out vec4 frag_color;\n"; | 105 source += "out vec4 frag_color;\n"; |
| 87 | 106 |
| 88 source += std::string( | 107 if (target == GL_TEXTURE_CUBE_MAP) |
| 108 source += "uniform highp int u_face;\n"; | |
| 109 | |
| 110 source += | |
| 89 "uniform mediump SamplerType u_texture;\n" | 111 "uniform mediump SamplerType u_texture;\n" |
| 90 "VARYING vec2 v_texCoord;\n" | 112 "VARYING vec2 v_texCoord;\n" |
| 91 "void main() {\n" | 113 "void main() {\n"; |
| 92 " TextureType color = TextureLookup(u_texture, v_texCoord);\n" | 114 |
| 115 if (target == GL_TEXTURE_CUBE_MAP) { | |
| 116 source += | |
| 117 " vec3 texCube;\n" | |
| 118 // Transform [0, 1] to [-1, 1]. | |
| 119 " vec2 texCoord = (v_texCoord * 2.0) - 1.0;\n" | |
| 120 // Transform 2d tex coord to each face of TEXTURE_CUBE_MAP coord. | |
| 121 // TEXTURE_CUBE_MAP_POSITIVE_X | |
| 122 " if (u_face == 34069) {\n" | |
| 123 " texCube = vec3(1.0, -texCoord.y, -texCoord.x);\n" | |
| 124 // TEXTURE_CUBE_MAP_NEGATIVE_X | |
| 125 " } else if (u_face == 34070) {\n" | |
| 126 " texCube = vec3(-1.0, -texCoord.y, texCoord.x);\n" | |
| 127 // TEXTURE_CUBE_MAP_POSITIVE_Y | |
| 128 " } else if (u_face == 34071) {\n" | |
| 129 " texCube = vec3(texCoord.x, 1.0, texCoord.y);\n" | |
| 130 // TEXTURE_CUBE_MAP_NEGATIVE_Y | |
| 131 " } else if (u_face == 34072) {\n" | |
| 132 " texCube = vec3(texCoord.x, -1.0, -texCoord.y);\n" | |
| 133 // TEXTURE_CUBE_MAP_POSITIVE_Z | |
| 134 " } else if (u_face == 34073) {\n" | |
| 135 " texCube = vec3(texCoord.x, -texCoord.y, 1.0);\n" | |
| 136 // TEXTURE_CUBE_MAP_NEGATIVE_Z | |
| 137 " } else if (u_face == 34074) {\n" | |
| 138 " texCube = vec3(-texCoord.x, -texCoord.y, -1.0);\n" | |
| 139 " }\n" | |
| 140 " TextureType color = TextureLookup(u_texture, texCube);\n"; | |
| 141 } else { | |
| 142 source += " TextureType color = TextureLookup(u_texture, v_texCoord);\n"; | |
| 143 } | |
| 144 | |
| 145 source += | |
| 93 " FRAGCOLOR = vec4(color) / ScaleValue;\n" | 146 " FRAGCOLOR = vec4(color) / ScaleValue;\n" |
| 94 "}\n"); | 147 "}\n"; |
| 95 return source; | 148 return source; |
| 96 } | 149 } |
| 97 | 150 |
| 98 void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t* color) { | 151 void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t* color) { |
| 99 color[0] = r; | 152 color[0] = r; |
| 100 color[1] = g; | 153 color[1] = g; |
| 101 color[2] = b; | 154 color[2] = b; |
| 102 color[3] = a; | 155 color[3] = a; |
| 103 } | 156 } |
| 104 | 157 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 GL_UNSIGNED_BYTE, nullptr); | 308 GL_UNSIGNED_BYTE, nullptr); |
| 256 } | 309 } |
| 257 } | 310 } |
| 258 | 311 |
| 259 GLuint CreateDrawingTexture(GLenum target, GLsizei width, GLsizei height) { | 312 GLuint CreateDrawingTexture(GLenum target, GLsizei width, GLsizei height) { |
| 260 GLuint texture = 0; | 313 GLuint texture = 0; |
| 261 glGenTextures(1, &texture); | 314 glGenTextures(1, &texture); |
| 262 glBindTexture(target, texture); | 315 glBindTexture(target, texture); |
| 263 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 316 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 264 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 317 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 265 CreateBackingForTexture(GL_TEXTURE_2D, width, height); | 318 CreateBackingForTexture(target, width, height); |
| 266 return texture; | 319 return texture; |
| 267 } | 320 } |
| 268 | 321 |
| 269 GLuint CreateDrawingFBO(GLenum target, GLuint texture) { | 322 GLuint CreateDrawingFBO(GLenum target, GLuint texture) { |
| 270 GLuint framebuffer = 0; | 323 GLuint framebuffer = 0; |
| 271 glGenFramebuffers(1, &framebuffer); | 324 glGenFramebuffers(1, &framebuffer); |
| 272 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); | 325 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); |
| 273 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, | 326 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, |
| 274 texture, 0); | 327 texture, 0); |
| 275 return framebuffer; | 328 return framebuffer; |
| 276 } | 329 } |
| 277 | 330 |
| 278 GLenum ExtractFormatFrom(GLenum internalformat) { | 331 GLenum ExtractFormatFrom(GLenum internalformat) { |
| 279 switch (internalformat) { | 332 switch (internalformat) { |
| 280 case GL_RGBA8_OES: | 333 case GL_RGBA8_OES: |
| 281 return GL_RGBA; | 334 return GL_RGBA; |
| 282 case GL_RGB8_OES: | 335 case GL_RGB8_OES: |
| 283 return GL_RGB; | 336 return GL_RGB; |
| 284 case GL_BGRA8_EXT: | 337 case GL_BGRA8_EXT: |
| 285 return GL_BGRA_EXT; | 338 return GL_BGRA_EXT; |
| 286 default: | 339 default: |
| 287 NOTREACHED(); | 340 NOTREACHED(); |
| 288 return GL_NONE; | 341 return GL_NONE; |
| 289 } | 342 } |
| 290 } | 343 } |
| 291 | 344 |
| 292 void RunCopyTexture(GLenum target, | 345 void RunCopyTexture(GLenum dest_target, |
| 293 CopyType copy_type, | 346 CopyType copy_type, |
| 294 FormatType src_format_type, | 347 FormatType src_format_type, |
| 295 GLint source_level, | 348 GLint source_level, |
| 296 FormatType dest_format_type, | 349 FormatType dest_format_type, |
| 297 GLint dest_level, | 350 GLint dest_level, |
| 298 bool is_es3) { | 351 bool is_es3) { |
| 299 const int src_channel_count = gles2::GLES2Util::ElementsPerGroup( | 352 const int src_channel_count = gles2::GLES2Util::ElementsPerGroup( |
| 300 src_format_type.format, src_format_type.type); | 353 src_format_type.format, src_format_type.type); |
| 301 uint8_t color[4] = {1u, 63u, 127u, 255u}; | 354 uint8_t color[4] = {1u, 63u, 127u, 255u}; |
| 302 std::unique_ptr<uint8_t[]> pixels(new uint8_t[width_ * height_ * 4]); | 355 std::unique_ptr<uint8_t[]> pixels(new uint8_t[width_ * height_ * 4]); |
| 303 for (int i = 0; i < width_ * height_ * src_channel_count; | 356 for (int i = 0; i < width_ * height_ * src_channel_count; |
| 304 i += src_channel_count) | 357 i += src_channel_count) |
| 305 for (int j = 0; j < src_channel_count; ++j) | 358 for (int j = 0; j < src_channel_count; ++j) |
| 306 pixels[i + j] = color[j]; | 359 pixels[i + j] = color[j]; |
| 307 uint8_t expected_color[4]; | 360 uint8_t expected_color[4]; |
| 308 uint8_t mask[4]; | 361 uint8_t mask[4]; |
| 309 getExpectedColor(src_format_type.internal_format, | 362 getExpectedColor(src_format_type.internal_format, |
| 310 dest_format_type.internal_format, color, expected_color, | 363 dest_format_type.internal_format, color, expected_color, |
| 311 mask); | 364 mask); |
| 312 | 365 |
| 366 GLenum source_target = GL_TEXTURE_2D; | |
| 313 glGenTextures(2, textures_); | 367 glGenTextures(2, textures_); |
| 314 glBindTexture(target, textures_[0]); | 368 glBindTexture(source_target, textures_[0]); |
| 315 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 369 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 316 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 370 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 317 #if defined(OS_MACOSX) | 371 #if defined(OS_MACOSX) |
| 318 // TODO(qiankun.miao@intel.com): Remove this workaround for Mac OSX, once | 372 // TODO(qiankun.miao@intel.com): Remove this workaround for Mac OSX, once |
| 319 // integer texture rendering bug is fixed on Mac OSX: crbug.com/679639. | 373 // integer texture rendering bug is fixed on Mac OSX: crbug.com/679639. |
| 320 glTexImage2D(target, 0, src_format_type.internal_format, | 374 glTexImage2D(source_target, 0, src_format_type.internal_format, |
| 321 width_ << source_level, height_ << source_level, 0, | 375 width_ << source_level, height_ << source_level, 0, |
| 322 src_format_type.format, src_format_type.type, nullptr); | 376 src_format_type.format, src_format_type.type, nullptr); |
| 323 #endif | 377 #endif |
| 324 glTexImage2D(target, source_level, src_format_type.internal_format, width_, | 378 glTexImage2D(source_target, source_level, src_format_type.internal_format, |
| 325 height_, 0, src_format_type.format, src_format_type.type, | 379 width_, height_, 0, src_format_type.format, |
| 326 pixels.get()); | 380 src_format_type.type, pixels.get()); |
| 327 EXPECT_TRUE(glGetError() == GL_NO_ERROR); | 381 EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
| 328 glBindTexture(target, textures_[1]); | 382 GLenum dest_binding_target = |
| 329 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 383 gles2::GLES2Util::GLFaceTargetToTextureTarget(dest_target); |
| 330 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 384 glBindTexture(dest_binding_target, textures_[1]); |
| 331 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 385 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 386 glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 387 glTexParameteri(dest_binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
| 332 // This hack makes dest texture complete in ES2 and ES3 context | 388 // This hack makes dest texture complete in ES2 and ES3 context |
| 333 // respectively. With this, sampling from the dest texture is correct. | 389 // respectively. With this, sampling from the dest texture is correct. |
| 334 if (is_es3) { | 390 if (is_es3) { |
| 335 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 391 glTexParameteri(dest_binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 336 glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, dest_level); | 392 glTexParameteri(dest_binding_target, GL_TEXTURE_BASE_LEVEL, dest_level); |
| 393 // For cube map textures, make the texture is cube complete. | |
| 394 if (dest_binding_target == GL_TEXTURE_CUBE_MAP) { | |
| 395 for (int i = 0; i < 6; ++i) { | |
| 396 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; | |
| 397 glTexImage2D(face, dest_level, dest_format_type.internal_format, | |
| 398 width_, height_, 0, dest_format_type.format, | |
| 399 dest_format_type.type, nullptr); | |
| 400 } | |
| 401 } | |
| 337 #if defined(OS_MACOSX) | 402 #if defined(OS_MACOSX) |
| 338 // TODO(qiankun.miao@intel.com): Remove this workaround for Mac OSX, once | 403 // TODO(qiankun.miao@intel.com): Remove this workaround for Mac OSX, once |
| 339 // framebuffer complete bug is fixed on Mac OSX: crbug.com/678526. | 404 // framebuffer complete bug is fixed on Mac OSX: crbug.com/678526. |
| 340 glTexImage2D(target, 0, dest_format_type.internal_format, | 405 glTexImage2D(dest_target, 0, dest_format_type.internal_format, |
| 341 width_ << dest_level, height_ << dest_level, 0, | 406 width_ << dest_level, height_ << dest_level, 0, |
| 342 dest_format_type.format, dest_format_type.type, nullptr); | 407 dest_format_type.format, dest_format_type.type, nullptr); |
| 343 #endif | 408 #endif |
| 344 } else { | 409 } else { |
| 345 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); | 410 glTexParameteri(dest_binding_target, GL_TEXTURE_MIN_FILTER, |
| 346 glTexImage2D(target, 0, dest_format_type.internal_format, | 411 GL_NEAREST_MIPMAP_NEAREST); |
| 347 width_ << dest_level, height_ << dest_level, 0, | 412 // For cube map textures, make the texture is cube complete. |
|
Zhenyao Mo
2017/01/27 00:10:17
nit: remove is.
qiankun
2017/01/29 15:39:31
Done.
| |
| 348 dest_format_type.format, dest_format_type.type, nullptr); | 413 if (dest_binding_target == GL_TEXTURE_CUBE_MAP) { |
| 349 glGenerateMipmap(target); | 414 for (int i = 0; i < 6; ++i) { |
| 415 GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i; | |
| 416 glTexImage2D(face, 0, dest_format_type.internal_format, | |
| 417 width_ << dest_level, height_ << dest_level, 0, | |
| 418 dest_format_type.format, dest_format_type.type, nullptr); | |
| 419 } | |
| 420 } else { | |
| 421 glTexImage2D(dest_target, 0, dest_format_type.internal_format, | |
| 422 width_ << dest_level, height_ << dest_level, 0, | |
| 423 dest_format_type.format, dest_format_type.type, nullptr); | |
| 424 } | |
| 425 glGenerateMipmap(dest_binding_target); | |
| 350 } | 426 } |
| 351 EXPECT_TRUE(glGetError() == GL_NO_ERROR); | 427 EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
| 352 | 428 |
| 353 if (copy_type == TexImage) { | 429 if (copy_type == TexImage) { |
| 354 glCopyTextureCHROMIUM(textures_[0], source_level, target, textures_[1], | 430 glCopyTextureCHROMIUM(textures_[0], source_level, dest_target, |
| 355 dest_level, dest_format_type.internal_format, | 431 textures_[1], dest_level, |
| 432 dest_format_type.internal_format, | |
| 356 dest_format_type.type, false, false, false); | 433 dest_format_type.type, false, false, false); |
| 357 } else { | 434 } else { |
| 358 glBindTexture(target, textures_[1]); | 435 glBindTexture(dest_binding_target, textures_[1]); |
| 359 glTexImage2D(target, dest_level, dest_format_type.internal_format, width_, | 436 glTexImage2D(dest_target, dest_level, dest_format_type.internal_format, |
| 360 height_, 0, dest_format_type.format, dest_format_type.type, | 437 width_, height_, 0, dest_format_type.format, |
| 361 nullptr); | 438 dest_format_type.type, nullptr); |
| 362 | 439 |
| 363 glCopySubTextureCHROMIUM(textures_[0], source_level, target, textures_[1], | 440 glCopySubTextureCHROMIUM(textures_[0], source_level, dest_target, |
| 364 dest_level, 0, 0, 0, 0, width_, height_, false, | 441 textures_[1], dest_level, 0, 0, 0, 0, width_, |
| 365 false, false); | 442 height_, false, false, false); |
| 366 } | 443 } |
| 367 EXPECT_TRUE(glGetError() == GL_NO_ERROR); | 444 EXPECT_TRUE(glGetError() == GL_NO_ERROR); |
| 368 | 445 |
| 369 // Draw destination texture to a fbo with a texture attachment in RGBA | 446 // Draw destination texture to a fbo with a TEXTURE_2D texture attachment |
| 370 // format. | 447 // in RGBA format. |
| 371 GLuint texture = CreateDrawingTexture(target, width_, height_); | 448 GLuint texture = CreateDrawingTexture(GL_TEXTURE_2D, width_, height_); |
| 372 GLuint framebuffer = CreateDrawingFBO(target, texture); | 449 GLuint framebuffer = CreateDrawingFBO(GL_TEXTURE_2D, texture); |
| 373 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), | 450 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), |
| 374 glCheckFramebufferStatus(GL_FRAMEBUFFER)); | 451 glCheckFramebufferStatus(GL_FRAMEBUFFER)); |
| 375 glViewport(0, 0, width_, height_); | 452 glViewport(0, 0, width_, height_); |
| 376 | 453 |
| 377 glBindTexture(target, textures_[1]); | 454 glBindTexture(dest_binding_target, textures_[1]); |
| 378 std::string fragment_shader_source = | 455 std::string fragment_shader_source = GetFragmentShaderSource( |
| 379 GetFragmentShaderSource(dest_format_type.internal_format, is_es3); | 456 dest_binding_target, dest_format_type.internal_format, is_es3); |
| 380 GLTestHelper::DrawTextureQuad( | 457 GLTestHelper::DrawTextureQuad( |
| 381 is_es3 ? kSimpleVertexShaderES3 : kSimpleVertexShaderES2, | 458 dest_target, is_es3 ? kSimpleVertexShaderES3 : kSimpleVertexShaderES2, |
| 382 fragment_shader_source.c_str(), "a_position", "u_texture"); | 459 fragment_shader_source.c_str(), "a_position", "u_texture", "u_face"); |
| 383 EXPECT_TRUE(GL_NO_ERROR == glGetError()); | 460 EXPECT_TRUE(GL_NO_ERROR == glGetError()); |
| 384 | 461 |
| 385 uint8_t tolerance = dest_format_type.internal_format == GL_RGBA4 ? 20 : 7; | 462 uint8_t tolerance = dest_format_type.internal_format == GL_RGBA4 ? 20 : 7; |
| 386 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, width_, height_, tolerance, | 463 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, width_, height_, tolerance, |
| 387 expected_color, mask)) | 464 expected_color, mask)) |
| 465 << " dest_target : " << gles2::GLES2Util::GetStringEnum(dest_target) | |
| 388 << " src_internal_format: " | 466 << " src_internal_format: " |
| 389 << gles2::GLES2Util::GetStringEnum(src_format_type.internal_format) | 467 << gles2::GLES2Util::GetStringEnum(src_format_type.internal_format) |
| 390 << " source_level: " << source_level | 468 << " source_level: " << source_level << " dest_internal_format: " |
| 391 << " dest_internal_format: " | |
| 392 << gles2::GLES2Util::GetStringEnum(dest_format_type.internal_format) | 469 << gles2::GLES2Util::GetStringEnum(dest_format_type.internal_format) |
| 393 << " dest_level: " << dest_level; | 470 << " dest_level: " << dest_level; |
| 394 | 471 |
| 395 glDeleteTextures(1, &texture); | 472 glDeleteTextures(1, &texture); |
| 396 glDeleteFramebuffers(1, &framebuffer); | 473 glDeleteFramebuffers(1, &framebuffer); |
| 397 glDeleteTextures(2, textures_); | 474 glDeleteTextures(2, textures_); |
| 398 } | 475 } |
| 399 | 476 |
| 400 GLManager gl_; | 477 GLManager gl_; |
| 401 GLuint textures_[2]; | 478 GLuint textures_[2]; |
| 402 GLsizei width_; | 479 GLsizei width_; |
| 403 GLsizei height_; | 480 GLsizei height_; |
| 404 GLuint framebuffer_id_; | 481 GLuint framebuffer_id_; |
| 405 }; | 482 }; |
| 406 | 483 |
| 407 class GLCopyTextureCHROMIUMES3Test : public GLCopyTextureCHROMIUMTest { | 484 class GLCopyTextureCHROMIUMES3Test : public GLCopyTextureCHROMIUMTest { |
| 408 protected: | 485 protected: |
| 409 void SetUp() override { | 486 void SetUp() override { |
| 410 GLManager::Options options; | 487 GLManager::Options options; |
| 411 options.context_type = gles2::CONTEXT_TYPE_OPENGLES3; | 488 options.context_type = gles2::CONTEXT_TYPE_OPENGLES3; |
| 412 options.size = gfx::Size(64, 64); | 489 options.size = gfx::Size(64, 64); |
| 413 gl_.Initialize(options); | 490 base::CommandLine command_line(*base::CommandLine::ForCurrentProcess()); |
| 491 #if defined(OS_MACOSX) | |
| 492 // Sampling of seamless integer cube map texture has bug on Intel GEN7 gpus | |
| 493 // on Mac OSX, see crbug.com/658930. | |
| 494 command_line.AppendSwitchASCII( | |
| 495 switches::kGpuDriverBugWorkarounds, | |
| 496 base::IntToString(gpu::DISABLE_TEXTURE_CUBE_MAP_SEAMLESS)); | |
| 497 #endif | |
| 498 gl_.InitializeWithCommandLine(options, command_line); | |
| 414 | 499 |
| 415 width_ = 8; | 500 width_ = 8; |
| 416 height_ = 8; | 501 height_ = 8; |
| 417 } | 502 } |
| 418 | 503 |
| 419 // If a driver isn't capable of supporting ES3 context, creating | 504 // If a driver isn't capable of supporting ES3 context, creating |
| 420 // ContextGroup will fail. Just skip the test. | 505 // ContextGroup will fail. Just skip the test. |
| 421 bool ShouldSkipTest() const { | 506 bool ShouldSkipTest() const { |
| 422 return (!gl_.decoder() || !gl_.decoder()->GetContextGroup()); | 507 return (!gl_.decoder() || !gl_.decoder()->GetContextGroup()); |
| 423 } | 508 } |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 787 if (dest_level > 0) | 872 if (dest_level > 0) |
| 788 continue; | 873 continue; |
| 789 #endif | 874 #endif |
| 790 RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, source_level, | 875 RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, source_level, |
| 791 dest_format_type, dest_level, true); | 876 dest_format_type, dest_level, true); |
| 792 } | 877 } |
| 793 } | 878 } |
| 794 } | 879 } |
| 795 } | 880 } |
| 796 | 881 |
| 882 TEST_P(GLCopyTextureCHROMIUMTest, CopyTextureCubeMap) { | |
| 883 CopyType copy_type = GetParam(); | |
| 884 | |
| 885 GLenum dest_targets[] = { | |
| 886 GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, | |
| 887 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, | |
| 888 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}; | |
| 889 FormatType src_format_type = {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE}; | |
| 890 FormatType dest_format_types[] = { | |
| 891 {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE}, {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE}, | |
| 892 }; | |
| 893 GLint source_level = 0; | |
| 894 GLint dest_level = 0; | |
| 895 | |
| 896 for (auto dest_format_type : dest_format_types) { | |
| 897 for (auto dest_target : dest_targets) { | |
| 898 RunCopyTexture(dest_target, copy_type, src_format_type, source_level, | |
| 899 dest_format_type, dest_level, false); | |
| 900 } | |
| 901 } | |
| 902 } | |
| 903 | |
| 904 TEST_P(GLCopyTextureCHROMIUMES3Test, CopyTextureCubeMap) { | |
| 905 if (ShouldSkipTest()) | |
| 906 return; | |
| 907 CopyType copy_type = GetParam(); | |
| 908 | |
| 909 GLenum dest_targets[] = { | |
| 910 GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, | |
| 911 GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, | |
| 912 GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z}; | |
| 913 FormatType src_format_type = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE}; | |
| 914 FormatType dest_format_types[] = { | |
| 915 {GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE}, | |
| 916 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE}, | |
| 917 {GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE}, | |
| 918 }; | |
| 919 GLint source_level = 0; | |
| 920 GLint dest_level = 0; | |
| 921 | |
| 922 for (auto dest_format_type : dest_format_types) { | |
| 923 for (auto dest_target : dest_targets) { | |
| 924 RunCopyTexture(dest_target, copy_type, src_format_type, source_level, | |
| 925 dest_format_type, dest_level, true); | |
| 926 } | |
| 927 } | |
| 928 } | |
| 929 | |
| 797 // Test to ensure that the destination texture is redefined if the properties | 930 // Test to ensure that the destination texture is redefined if the properties |
| 798 // are different. | 931 // are different. |
| 799 TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) { | 932 TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) { |
| 800 uint8_t pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u, | 933 uint8_t pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u, |
| 801 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u}; | 934 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u}; |
| 802 | 935 |
| 803 CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D); | 936 CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D); |
| 804 glBindTexture(GL_TEXTURE_2D, textures_[0]); | 937 glBindTexture(GL_TEXTURE_2D, textures_[0]); |
| 805 glTexImage2D( | 938 glTexImage2D( |
| 806 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); | 939 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1451 } | 1584 } |
| 1452 } | 1585 } |
| 1453 | 1586 |
| 1454 glDeleteTextures(2, textures_); | 1587 glDeleteTextures(2, textures_); |
| 1455 glDeleteFramebuffers(1, &framebuffer_id_); | 1588 glDeleteFramebuffers(1, &framebuffer_id_); |
| 1456 } | 1589 } |
| 1457 } | 1590 } |
| 1458 } | 1591 } |
| 1459 | 1592 |
| 1460 } // namespace gpu | 1593 } // namespace gpu |
| OLD | NEW |