Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(542)

Side by Side Diff: gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc

Issue 2609393002: Add CopyTexture gl_tests for level == 0 (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
(...skipping 11 matching lines...) Expand all
22 namespace gpu { 22 namespace gpu {
23 23
24 namespace { 24 namespace {
25 25
26 enum CopyType { TexImage, TexSubImage }; 26 enum CopyType { TexImage, TexSubImage };
27 const CopyType kCopyTypes[] = { 27 const CopyType kCopyTypes[] = {
28 TexImage, 28 TexImage,
29 TexSubImage, 29 TexSubImage,
30 }; 30 };
31 31
32 struct FormatType {
33 GLenum internal_format;
34 GLenum format;
35 GLenum type;
36 };
37
38 static const char* kSimpleVertexShaderES2 =
39 "attribute vec2 a_position;\n"
40 "varying vec2 v_texCoord;\n"
41 "void main() {\n"
42 " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n"
43 " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n"
44 "}\n";
45
32 static const char* kSimpleVertexShaderES3 = 46 static const char* kSimpleVertexShaderES3 =
33 "#version 300 es\n" 47 "#version 300 es\n"
34 "in vec2 a_position;\n" 48 "in vec2 a_position;\n"
35 "out vec2 v_texCoord;\n" 49 "out vec2 v_texCoord;\n"
36 "void main() {\n" 50 "void main() {\n"
37 " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n" 51 " gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0);\n"
38 " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n" 52 " v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5;\n"
39 "}\n"; 53 "}\n";
40 54
41 std::string GetFragmentShaderSource(GLenum format) { 55 std::string GetFragmentShaderSource(GLenum format, bool is_es3) {
42 std::string source; 56 std::string source;
43 source += std::string( 57 if (is_es3) {
44 "#version 300 es\n" 58 source +=
45 "precision mediump float;\n"); 59 "#version 300 es\n"
60 "#define VARYING in\n"
61 "#define FRAGCOLOR frag_color\n"
62 "#define TextureLookup texture\n";
63 } else {
64 source +=
65 "#define VARYING varying\n"
66 "#define FRAGCOLOR gl_FragColor\n"
67 "#define TextureLookup texture2D\n";
68 }
69 source += "precision mediump float;\n";
70
46 if (gles2::GLES2Util::IsSignedIntegerFormat(format)) { 71 if (gles2::GLES2Util::IsSignedIntegerFormat(format)) {
47 source += std::string("#define SamplerType isampler2D\n"); 72 source += std::string("#define SamplerType isampler2D\n");
48 source += std::string("#define TextureType ivec4\n"); 73 source += std::string("#define TextureType ivec4\n");
49 source += std::string("#define ScaleValue 255.0\n"); 74 source += std::string("#define ScaleValue 255.0\n");
50 } else if (gles2::GLES2Util::IsUnsignedIntegerFormat(format)) { 75 } else if (gles2::GLES2Util::IsUnsignedIntegerFormat(format)) {
51 source += std::string("#define SamplerType usampler2D\n"); 76 source += std::string("#define SamplerType usampler2D\n");
52 source += std::string("#define TextureType uvec4\n"); 77 source += std::string("#define TextureType uvec4\n");
53 source += std::string("#define ScaleValue 255.0\n"); 78 source += std::string("#define ScaleValue 255.0\n");
54 } else { 79 } else {
55 source += std::string("#define SamplerType sampler2D\n"); 80 source += std::string("#define SamplerType sampler2D\n");
56 source += std::string("#define TextureType vec4\n"); 81 source += std::string("#define TextureType vec4\n");
57 source += std::string("#define ScaleValue 1.0\n"); 82 source += std::string("#define ScaleValue 1.0\n");
58 } 83 }
59 84
85 if (is_es3)
86 source += "out vec4 frag_color;\n";
87
60 source += std::string( 88 source += std::string(
61 "uniform mediump SamplerType u_texture;\n" 89 "uniform mediump SamplerType u_texture;\n"
62 "in vec2 v_texCoord;\n" 90 "VARYING vec2 v_texCoord;\n"
63 "out vec4 fragData;\n"
64 "void main() {\n" 91 "void main() {\n"
65 " TextureType color = texture(u_texture, v_texCoord);\n" 92 " TextureType color = TextureLookup(u_texture, v_texCoord);\n"
66 " fragData = vec4(color) / ScaleValue;\n" 93 " FRAGCOLOR = vec4(color) / ScaleValue;\n"
67 "}\n"); 94 "}\n");
68 return source; 95 return source;
69 } 96 }
70 97
71 void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t* color) { 98 void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t* color) {
72 color[0] = r; 99 color[0] = r;
73 color[1] = g; 100 color[1] = g;
74 color[2] = b; 101 color[2] = b;
75 color[3] = a; 102 color[3] = a;
76 } 103 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 210 }
184 } 211 }
185 212
186 } // namespace 213 } // namespace
187 214
188 // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension. 215 // A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
189 class GLCopyTextureCHROMIUMTest 216 class GLCopyTextureCHROMIUMTest
190 : public testing::Test, 217 : public testing::Test,
191 public ::testing::WithParamInterface<CopyType> { 218 public ::testing::WithParamInterface<CopyType> {
192 protected: 219 protected:
193
194 void CreateAndBindDestinationTextureAndFBO(GLenum target) { 220 void CreateAndBindDestinationTextureAndFBO(GLenum target) {
195 glGenTextures(2, textures_); 221 glGenTextures(2, textures_);
196 glBindTexture(target, textures_[1]); 222 glBindTexture(target, textures_[1]);
197 223
198 // Some drivers (NVidia/SGX) require texture settings to be a certain way or 224 // Some drivers (NVidia/SGX) require texture settings to be a certain way or
199 // they won't report FRAMEBUFFER_COMPLETE. 225 // they won't report FRAMEBUFFER_COMPLETE.
200 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 226 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
201 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 227 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
202 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 228 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
203 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 229 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
204 230
205 glGenFramebuffers(1, &framebuffer_id_); 231 glGenFramebuffers(1, &framebuffer_id_);
206 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_); 232 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer_id_);
207 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, 233 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
208 textures_[1], 0); 234 textures_[1], 0);
209 } 235 }
210 236
211 void SetUp() override { 237 void SetUp() override {
212 gl_.Initialize(GLManager::Options()); 238 GLManager::Options options;
239 options.size = gfx::Size(64, 64);
240 gl_.Initialize(options);
241
242 width_ = 8;
243 height_ = 8;
213 } 244 }
214 245
215 void TearDown() override { gl_.Destroy(); } 246 void TearDown() override { gl_.Destroy(); }
216 247
217 void CreateBackingForTexture(GLenum target, GLsizei width, GLsizei height) { 248 void CreateBackingForTexture(GLenum target, GLsizei width, GLsizei height) {
218 if (target == GL_TEXTURE_RECTANGLE_ARB) { 249 if (target == GL_TEXTURE_RECTANGLE_ARB) {
219 GLuint image_id = glCreateGpuMemoryBufferImageCHROMIUM( 250 GLuint image_id = glCreateGpuMemoryBufferImageCHROMIUM(
220 width, height, GL_RGBA, GL_READ_WRITE_CHROMIUM); 251 width, height, GL_RGBA, GL_READ_WRITE_CHROMIUM);
221 glBindTexImage2DCHROMIUM(target, image_id); 252 glBindTexImage2DCHROMIUM(target, image_id);
222 } else { 253 } else {
223 glTexImage2D(target, 0, GL_RGBA, width, height, 0, GL_RGBA, 254 glTexImage2D(target, 0, GL_RGBA, width, height, 0, GL_RGBA,
224 GL_UNSIGNED_BYTE, nullptr); 255 GL_UNSIGNED_BYTE, nullptr);
225 } 256 }
226 } 257 }
227 258
259 GLuint CreateDrawingTexture(GLenum target, GLsizei width, GLsizei height) {
260 GLuint texture = 0;
261 glGenTextures(1, &texture);
262 glBindTexture(target, texture);
263 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
264 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
265 CreateBackingForTexture(GL_TEXTURE_2D, width, height);
266 return texture;
267 }
268
269 GLuint CreateDrawingFBO(GLenum target, GLuint texture) {
270 GLuint framebuffer = 0;
271 glGenFramebuffers(1, &framebuffer);
272 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
273 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
274 texture, 0);
275 return framebuffer;
276 }
277
228 GLenum ExtractFormatFrom(GLenum internalformat) { 278 GLenum ExtractFormatFrom(GLenum internalformat) {
229 switch (internalformat) { 279 switch (internalformat) {
230 case GL_RGBA8_OES: 280 case GL_RGBA8_OES:
231 return GL_RGBA; 281 return GL_RGBA;
232 case GL_RGB8_OES: 282 case GL_RGB8_OES:
233 return GL_RGB; 283 return GL_RGB;
234 case GL_BGRA8_EXT: 284 case GL_BGRA8_EXT:
235 return GL_BGRA_EXT; 285 return GL_BGRA_EXT;
236 default: 286 default:
237 NOTREACHED(); 287 NOTREACHED();
238 return GL_NONE; 288 return GL_NONE;
239 } 289 }
240 } 290 }
241 291
292 void RunCopyTexture(GLenum target,
293 CopyType copy_type,
294 FormatType src_format_type,
295 GLint source_level,
296 FormatType dest_format_type,
297 GLint dest_level,
298 bool is_es3) {
299 const int src_channel_count = gles2::GLES2Util::ElementsPerGroup(
300 src_format_type.format, src_format_type.type);
301 uint8_t color[4] = {1u, 63u, 127u, 255u};
302 std::unique_ptr<uint8_t[]> pixels(new uint8_t[width_ * height_ * 4]);
303 for (int i = 0; i < width_ * height_ * src_channel_count;
304 i += src_channel_count)
305 for (int j = 0; j < src_channel_count; ++j)
306 pixels[i + j] = color[j];
307 uint8_t expected_color[4];
308 uint8_t mask[4];
309 getExpectedColor(src_format_type.internal_format,
310 dest_format_type.internal_format, color, expected_color,
311 mask);
312
313 glGenTextures(2, textures_);
314 glBindTexture(target, textures_[0]);
315 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
316 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
317 glTexImage2D(target, source_level, src_format_type.internal_format, width_,
318 height_, 0, src_format_type.format, src_format_type.type,
319 pixels.get());
320 EXPECT_TRUE(glGetError() == GL_NO_ERROR);
321 glBindTexture(target, textures_[1]);
322 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
323 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
324 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
325 EXPECT_TRUE(glGetError() == GL_NO_ERROR);
326
327 if (copy_type == TexImage) {
328 glCopyTextureCHROMIUM(textures_[0], textures_[1],
Zhenyao Mo 2017/01/04 18:51:21 Could you please add a comment here that this func
qiankun 2017/01/05 03:07:45 Done.
329 dest_format_type.internal_format,
330 dest_format_type.type, false, false, false);
331 } else {
332 glBindTexture(target, textures_[1]);
333 glTexImage2D(target, dest_level, dest_format_type.internal_format, width_,
334 height_, 0, dest_format_type.format, dest_format_type.type,
335 nullptr);
336
337 glCopySubTextureCHROMIUM(textures_[0], textures_[1], 0, 0, 0, 0, width_,
Zhenyao Mo 2017/01/04 18:51:21 Same here.
qiankun 2017/01/05 03:07:45 Done.
338 height_, false, false, false);
339 }
340 EXPECT_TRUE(glGetError() == GL_NO_ERROR);
341
342 // Draw destination texture to a fbo with a texture attachment in RGBA
343 // format.
344 GLuint texture = CreateDrawingTexture(target, width_, height_);
345 GLuint framebuffer = CreateDrawingFBO(target, texture);
346 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
347 glCheckFramebufferStatus(GL_FRAMEBUFFER));
348 glViewport(0, 0, width_, height_);
349
350 glBindTexture(target, textures_[1]);
351 std::string fragment_shader_source =
352 GetFragmentShaderSource(dest_format_type.internal_format, is_es3);
353 GLTestHelper::DrawTextureQuad(
Zhenyao Mo 2017/01/04 18:51:21 Again, the tex level information isn't reflected h
qiankun 2017/01/05 03:07:45 Done.
354 is_es3 ? kSimpleVertexShaderES3 : kSimpleVertexShaderES2,
355 fragment_shader_source.c_str(), "a_position", "u_texture");
356 EXPECT_TRUE(GL_NO_ERROR == glGetError());
357
358 uint8_t tolerance = dest_format_type.internal_format == GL_RGBA4 ? 20 : 7;
359 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, width_, height_, tolerance,
360 expected_color, mask))
361 << " src_internal_format: "
362 << gles2::GLES2Util::GetStringEnum(src_format_type.internal_format)
363 << " source_level: " << source_level
364 << " dest_internal_format: "
365 << gles2::GLES2Util::GetStringEnum(dest_format_type.internal_format)
366 << " dest_level: " << dest_level;
367
368 glDeleteTextures(1, &texture);
369 glDeleteFramebuffers(1, &framebuffer);
370 glDeleteTextures(2, textures_);
371 }
372
242 GLManager gl_; 373 GLManager gl_;
243 GLuint textures_[2]; 374 GLuint textures_[2];
375 GLsizei width_;
376 GLsizei height_;
244 GLuint framebuffer_id_; 377 GLuint framebuffer_id_;
245 }; 378 };
246 379
247 class GLCopyTextureCHROMIUMES3Test : public GLCopyTextureCHROMIUMTest { 380 class GLCopyTextureCHROMIUMES3Test : public GLCopyTextureCHROMIUMTest {
248 protected: 381 protected:
249 void SetUp() override { 382 void SetUp() override {
250 GLManager::Options options; 383 GLManager::Options options;
251 options.context_type = gles2::CONTEXT_TYPE_OPENGLES3; 384 options.context_type = gles2::CONTEXT_TYPE_OPENGLES3;
252 options.size = gfx::Size(64, 64); 385 options.size = gfx::Size(64, 64);
253 gl_.Initialize(options); 386 gl_.Initialize(options);
387
388 width_ = 8;
389 height_ = 8;
254 } 390 }
255 391
256 // If a driver isn't capable of supporting ES3 context, creating 392 // If a driver isn't capable of supporting ES3 context, creating
257 // ContextGroup will fail. Just skip the test. 393 // ContextGroup will fail. Just skip the test.
258 bool ShouldSkipTest() const { 394 bool ShouldSkipTest() const {
259 return (!gl_.decoder() || !gl_.decoder()->GetContextGroup()); 395 return (!gl_.decoder() || !gl_.decoder()->GetContextGroup());
260 } 396 }
261 397
262 // RGB9_E5 isn't accepted by glCopyTexImage2D if underlying context is ES. 398 // RGB9_E5 isn't accepted by glCopyTexImage2D if underlying context is ES.
263 // TODO(qiankun.miao@intel.com): we should support RGB9_E5 in ES context. 399 // TODO(qiankun.miao@intel.com): we should support RGB9_E5 in ES context.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 474
339 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels, nullptr); 475 GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels, nullptr);
340 EXPECT_TRUE(GL_NO_ERROR == glGetError()); 476 EXPECT_TRUE(GL_NO_ERROR == glGetError());
341 } 477 }
342 478
343 TEST_P(GLCopyTextureCHROMIUMES3Test, FormatCombinations) { 479 TEST_P(GLCopyTextureCHROMIUMES3Test, FormatCombinations) {
344 if (ShouldSkipTest()) 480 if (ShouldSkipTest())
345 return; 481 return;
346 CopyType copy_type = GetParam(); 482 CopyType copy_type = GetParam();
347 483
348 struct FormatType {
349 GLenum internal_format;
350 GLenum format;
351 GLenum type;
352 };
353
354 FormatType src_format_types[] = { 484 FormatType src_format_types[] = {
355 {GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE}, 485 {GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE},
356 {GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE}, 486 {GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE},
357 {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE}, 487 {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE},
358 {GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE}, 488 {GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE},
359 {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE}, 489 {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE},
360 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE}, 490 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE},
361 {GL_BGRA_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE}, 491 {GL_BGRA_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE},
362 {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE}, 492 {GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE},
363 }; 493 };
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 if (gles2::GLES2Util::IsFloatFormat(dest_format_type.internal_format) && 550 if (gles2::GLES2Util::IsFloatFormat(dest_format_type.internal_format) &&
421 ShouldSkipFloatFormat()) 551 ShouldSkipFloatFormat())
422 continue; 552 continue;
423 if ((dest_format_type.internal_format == GL_SRGB_EXT || 553 if ((dest_format_type.internal_format == GL_SRGB_EXT ||
424 dest_format_type.internal_format == GL_SRGB_ALPHA_EXT) && 554 dest_format_type.internal_format == GL_SRGB_ALPHA_EXT) &&
425 ShouldSkipSRGBEXT()) 555 ShouldSkipSRGBEXT())
426 continue; 556 continue;
427 if (dest_format_type.internal_format == GL_RGB5_A1 && ShouldSkipRGB5_A1()) 557 if (dest_format_type.internal_format == GL_RGB5_A1 && ShouldSkipRGB5_A1())
428 continue; 558 continue;
429 559
430 const GLsizei kWidth = 8, kHeight = 8; 560 RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, 0,
431 const int src_channel_count = gles2::GLES2Util::ElementsPerGroup( 561 dest_format_type, 0, true);
432 src_format_type.format, src_format_type.type);
433 uint8_t color[4] = {1, 63, 127, 255};
434 uint8_t pixels[8 * 8 * 4];
435 for (int i = 0; i < kWidth * kHeight * src_channel_count;
436 i += src_channel_count)
437 for (int j = 0; j < src_channel_count; ++j)
438 pixels[i + j] = color[j];
439 uint8_t expected_color[4];
440 uint8_t mask[4];
441 getExpectedColor(src_format_type.internal_format,
442 dest_format_type.internal_format, color, expected_color,
443 mask);
444
445 CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D);
446 glBindTexture(GL_TEXTURE_2D, textures_[0]);
447 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
448 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
449 glTexImage2D(GL_TEXTURE_2D, 0, src_format_type.internal_format, kWidth,
450 kHeight, 0, src_format_type.format, src_format_type.type,
451 pixels);
452
453 EXPECT_TRUE(glGetError() == GL_NO_ERROR);
454 if (copy_type == TexImage) {
455 glCopyTextureCHROMIUM(textures_[0], textures_[1],
456 dest_format_type.internal_format,
457 dest_format_type.type, false, false, false);
458 } else {
459 glBindTexture(GL_TEXTURE_2D, textures_[1]);
460 glTexImage2D(GL_TEXTURE_2D, 0, dest_format_type.internal_format, kWidth,
461 kHeight, 0, dest_format_type.format, dest_format_type.type,
462 nullptr);
463
464 glCopySubTextureCHROMIUM(textures_[0], textures_[1], 0, 0, 0, 0, kWidth,
465 kHeight, false, false, false);
466 }
467 EXPECT_TRUE(glGetError() == GL_NO_ERROR)
468 << " src_internal_format: "
469 << gles2::GLES2Util::GetStringEnum(src_format_type.internal_format)
470 << " dest_internal_format: "
471 << gles2::GLES2Util::GetStringEnum(dest_format_type.internal_format);
472
473 // Draw destination texture to a fbo with attachment in RGBA format.
474 glBindFramebuffer(GL_FRAMEBUFFER, 0);
475 GLuint framebuffer = 0;
476 glGenFramebuffers(1, &framebuffer);
477 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
478 GLuint texture = 0;
479 glGenTextures(1, &texture);
480 glBindTexture(GL_TEXTURE_2D, texture);
481 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
482 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
483 CreateBackingForTexture(GL_TEXTURE_2D, kWidth, kHeight);
484 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
485 GL_TEXTURE_2D, texture, 0);
486 EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
487 glCheckFramebufferStatus(GL_FRAMEBUFFER));
488 glViewport(0, 0, kWidth, kHeight);
489
490 glBindTexture(GL_TEXTURE_2D, textures_[1]);
491 std::string fragment_shader_source =
492 GetFragmentShaderSource(dest_format_type.internal_format);
493 GLTestHelper::DrawTextureQuad(kSimpleVertexShaderES3,
494 fragment_shader_source.c_str(),
495 "a_position", "u_texture");
496
497 uint8_t tolerance = dest_format_type.internal_format == GL_RGBA4 ? 20 : 7;
498 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kWidth, kHeight, tolerance,
499 expected_color, mask))
500 << " src_internal_format: "
501 << gles2::GLES2Util::GetStringEnum(src_format_type.internal_format)
502 << " dest_internal_format: "
503 << gles2::GLES2Util::GetStringEnum(dest_format_type.internal_format);
504 EXPECT_TRUE(GL_NO_ERROR == glGetError());
505
506 glDeleteTextures(1, &texture);
507 glDeleteFramebuffers(1, &framebuffer);
508 glDeleteTextures(2, textures_);
509 glDeleteFramebuffers(1, &framebuffer_id_);
510 } 562 }
511 } 563 }
512 } 564 }
513 565
514 TEST_P(GLCopyTextureCHROMIUMTest, ImmutableTexture) { 566 TEST_P(GLCopyTextureCHROMIUMTest, ImmutableTexture) {
515 if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) { 567 if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) {
516 LOG(INFO) << "GL_EXT_texture_storage not supported. Skipping test..."; 568 LOG(INFO) << "GL_EXT_texture_storage not supported. Skipping test...";
517 return; 569 return;
518 } 570 }
519 CopyType copy_type = GetParam(); 571 CopyType copy_type = GetParam();
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 glCopyTextureCHROMIUM( 705 glCopyTextureCHROMIUM(
654 textures_[0], textures_[1], unsupported_format_types[dest_index].format, 706 textures_[0], textures_[1], unsupported_format_types[dest_index].format,
655 unsupported_format_types[dest_index].type, false, false, false); 707 unsupported_format_types[dest_index].type, false, false, false);
656 EXPECT_TRUE(GL_INVALID_OPERATION == glGetError()) 708 EXPECT_TRUE(GL_INVALID_OPERATION == glGetError())
657 << "dest_index:" << dest_index; 709 << "dest_index:" << dest_index;
658 } 710 }
659 glDeleteTextures(2, textures_); 711 glDeleteTextures(2, textures_);
660 glDeleteFramebuffers(1, &framebuffer_id_); 712 glDeleteFramebuffers(1, &framebuffer_id_);
661 } 713 }
662 714
715 TEST_P(GLCopyTextureCHROMIUMTest, CopyTextureLevel) {
716 CopyType copy_type = GetParam();
717
718 // Copy from RGB source texture to dest texture.
719 FormatType src_format_type = {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE};
720 FormatType dest_format_types[] = {
721 {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE},
722 {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE},
723 };
724 // Source level must be 0 in ES2 context.
Zhenyao Mo 2017/01/04 18:51:22 Even this can be lifted if you sample the source t
qiankun 2017/01/05 03:07:45 We cannot do this if the source texture is not com
725 GLint source_level = 0;
726
727 // TODO(qiankun.miao@intel.com): Support level > 0.
728 for (GLint dest_level = 0; dest_level < 1; dest_level++) {
729 for (auto dest_format_type : dest_format_types) {
730 RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, source_level,
731 dest_format_type, dest_level, false);
732 }
733 }
734 }
735
736 TEST_P(GLCopyTextureCHROMIUMES3Test, CopyTextureLevel) {
737 if (ShouldSkipTest())
738 return;
739 CopyType copy_type = GetParam();
740
741 // Copy from RGBA source texture to dest texture.
742 FormatType src_format_type = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE};
743 FormatType dest_format_types[] = {
744 {GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE},
745 {GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE},
746 {GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE},
747 };
748
749 // TODO(qiankun.miao@intel.com): Support level > 0.
750 for (GLint source_level = 0; source_level < 1; source_level++) {
751 for (GLint dest_level = 0; dest_level < 1; dest_level++) {
752 for (auto dest_format_type : dest_format_types) {
753 RunCopyTexture(GL_TEXTURE_2D, copy_type, src_format_type, source_level,
754 dest_format_type, dest_level, true);
755 }
756 }
757 }
758 }
759
663 // Test to ensure that the destination texture is redefined if the properties 760 // Test to ensure that the destination texture is redefined if the properties
664 // are different. 761 // are different.
665 TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) { 762 TEST_F(GLCopyTextureCHROMIUMTest, RedefineDestinationTexture) {
666 uint8_t pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u, 763 uint8_t pixels[4 * 4] = {255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u,
667 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u}; 764 255u, 0u, 0u, 255u, 255u, 0u, 0u, 255u};
668 765
669 CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D); 766 CreateAndBindDestinationTextureAndFBO(GL_TEXTURE_2D);
670 glBindTexture(GL_TEXTURE_2D, textures_[0]); 767 glBindTexture(GL_TEXTURE_2D, textures_[0]);
671 glTexImage2D( 768 glTexImage2D(
672 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 769 GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 } 1413 }
1317 } 1414 }
1318 1415
1319 glDeleteTextures(2, textures_); 1416 glDeleteTextures(2, textures_);
1320 glDeleteFramebuffers(1, &framebuffer_id_); 1417 glDeleteFramebuffers(1, &framebuffer_id_);
1321 } 1418 }
1322 } 1419 }
1323 } 1420 }
1324 1421
1325 } // namespace gpu 1422 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698