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 // Tests for GLES2Implementation. | 5 // Tests for GLES2Implementation. |
6 | 6 |
7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 2215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2226 GetExpectedResultMemory(sizeof(cmds::GetError::Result)); | 2226 GetExpectedResultMemory(sizeof(cmds::GetError::Result)); |
2227 | 2227 |
2228 EXPECT_CALL(*command_buffer(), OnFlush()) | 2228 EXPECT_CALL(*command_buffer(), OnFlush()) |
2229 .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) | 2229 .WillOnce(SetMemory(result1.ptr, GLuint(GL_NO_ERROR))) |
2230 .RetiresOnSaturation(); | 2230 .RetiresOnSaturation(); |
2231 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); | 2231 EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); |
2232 } | 2232 } |
2233 | 2233 |
2234 static bool CheckRect( | 2234 static bool CheckRect( |
2235 int width, int height, GLenum format, GLenum type, int alignment, | 2235 int width, int height, GLenum format, GLenum type, int alignment, |
2236 bool flip_y, const uint8* r1, const uint8* r2) { | 2236 const uint8* r1, const uint8* r2) { |
2237 uint32 size = 0; | 2237 uint32 size = 0; |
2238 uint32 unpadded_row_size = 0; | 2238 uint32 unpadded_row_size = 0; |
2239 uint32 padded_row_size = 0; | 2239 uint32 padded_row_size = 0; |
2240 if (!GLES2Util::ComputeImageDataSizes( | 2240 if (!GLES2Util::ComputeImageDataSizes( |
2241 width, height, 1, format, type, alignment, &size, &unpadded_row_size, | 2241 width, height, 1, format, type, alignment, &size, &unpadded_row_size, |
2242 &padded_row_size)) { | 2242 &padded_row_size)) { |
2243 return false; | 2243 return false; |
2244 } | 2244 } |
2245 | 2245 |
2246 int r2_stride = flip_y ? | 2246 int r2_stride = static_cast<int>(padded_row_size); |
2247 -static_cast<int>(padded_row_size) : | |
2248 static_cast<int>(padded_row_size); | |
2249 r2 = flip_y ? (r2 + (height - 1) * padded_row_size) : r2; | |
2250 | 2247 |
2251 for (int y = 0; y < height; ++y) { | 2248 for (int y = 0; y < height; ++y) { |
2252 if (memcmp(r1, r2, unpadded_row_size) != 0) { | 2249 if (memcmp(r1, r2, unpadded_row_size) != 0) { |
2253 return false; | 2250 return false; |
2254 } | 2251 } |
2255 r1 += padded_row_size; | 2252 r1 += padded_row_size; |
2256 r2 += r2_stride; | 2253 r2 += r2_stride; |
2257 } | 2254 } |
2258 return true; | 2255 return true; |
2259 } | 2256 } |
2260 | 2257 |
2261 ACTION_P8(CheckRectAction, width, height, format, type, alignment, flip_y, | 2258 ACTION_P7(CheckRectAction, width, height, format, type, alignment, r1, r2) { |
2262 r1, r2) { | |
2263 EXPECT_TRUE(CheckRect( | 2259 EXPECT_TRUE(CheckRect( |
2264 width, height, format, type, alignment, flip_y, r1, r2)); | 2260 width, height, format, type, alignment, r1, r2)); |
2265 } | 2261 } |
2266 | 2262 |
2267 // Test TexImage2D with and without flip_y | |
2268 TEST_F(GLES2ImplementationTest, TexImage2D) { | 2263 TEST_F(GLES2ImplementationTest, TexImage2D) { |
2269 struct Cmds { | 2264 struct Cmds { |
2270 cmds::TexImage2D tex_image_2d; | 2265 cmds::TexImage2D tex_image_2d; |
2271 cmd::SetToken set_token; | 2266 cmd::SetToken set_token; |
2272 }; | 2267 }; |
2273 struct Cmds2 { | 2268 struct Cmds2 { |
2274 cmds::TexImage2D tex_image_2d; | 2269 cmds::TexImage2D tex_image_2d; |
2275 cmd::SetToken set_token; | 2270 cmd::SetToken set_token; |
2276 }; | 2271 }; |
2277 const GLenum kTarget = GL_TEXTURE_2D; | 2272 const GLenum kTarget = GL_TEXTURE_2D; |
(...skipping 16 matching lines...) Expand all Loading... |
2294 Cmds expected; | 2289 Cmds expected; |
2295 expected.tex_image_2d.Init( | 2290 expected.tex_image_2d.Init( |
2296 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, | 2291 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, |
2297 mem1.id, mem1.offset); | 2292 mem1.id, mem1.offset); |
2298 expected.set_token.Init(GetNextToken()); | 2293 expected.set_token.Init(GetNextToken()); |
2299 gl_->TexImage2D( | 2294 gl_->TexImage2D( |
2300 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | 2295 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, |
2301 pixels); | 2296 pixels); |
2302 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2297 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2303 EXPECT_TRUE(CheckRect( | 2298 EXPECT_TRUE(CheckRect( |
2304 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, | 2299 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, |
2305 pixels, mem1.ptr)); | 2300 pixels, mem1.ptr)); |
2306 | |
2307 ClearCommands(); | |
2308 gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); | |
2309 | |
2310 ExpectedMemoryInfo mem2 = GetExpectedMemory(sizeof(pixels)); | |
2311 Cmds2 expected2; | |
2312 expected2.tex_image_2d.Init( | |
2313 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, | |
2314 mem2.id, mem2.offset); | |
2315 expected2.set_token.Init(GetNextToken()); | |
2316 const void* commands2 = GetPut(); | |
2317 gl_->TexImage2D( | |
2318 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | |
2319 pixels); | |
2320 EXPECT_EQ(0, memcmp(&expected2, commands2, sizeof(expected2))); | |
2321 EXPECT_TRUE(CheckRect( | |
2322 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, true, | |
2323 pixels, mem2.ptr)); | |
2324 } | 2301 } |
2325 | 2302 |
2326 TEST_F(GLES2ImplementationTest, TexImage2DViaMappedMem) { | 2303 TEST_F(GLES2ImplementationTest, TexImage2DViaMappedMem) { |
2327 struct Cmds { | 2304 struct Cmds { |
2328 cmds::TexImage2D tex_image_2d; | 2305 cmds::TexImage2D tex_image_2d; |
2329 cmd::SetToken set_token; | 2306 cmd::SetToken set_token; |
2330 }; | 2307 }; |
2331 const GLenum kTarget = GL_TEXTURE_2D; | 2308 const GLenum kTarget = GL_TEXTURE_2D; |
2332 const GLint kLevel = 0; | 2309 const GLint kLevel = 0; |
2333 const GLenum kFormat = GL_RGB; | 2310 const GLenum kFormat = GL_RGB; |
(...skipping 24 matching lines...) Expand all Loading... |
2358 Cmds expected; | 2335 Cmds expected; |
2359 expected.tex_image_2d.Init( | 2336 expected.tex_image_2d.Init( |
2360 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, | 2337 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, |
2361 mem1.id, mem1.offset); | 2338 mem1.id, mem1.offset); |
2362 expected.set_token.Init(GetNextToken()); | 2339 expected.set_token.Init(GetNextToken()); |
2363 gl_->TexImage2D( | 2340 gl_->TexImage2D( |
2364 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | 2341 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, |
2365 pixels.get()); | 2342 pixels.get()); |
2366 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2343 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2367 EXPECT_TRUE(CheckRect( | 2344 EXPECT_TRUE(CheckRect( |
2368 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, | 2345 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, |
2369 pixels.get(), mem1.ptr)); | 2346 pixels.get(), mem1.ptr)); |
2370 } | 2347 } |
2371 | 2348 |
2372 // Test TexImage2D with 2 writes | 2349 // Test TexImage2D with 2 writes |
2373 TEST_F(GLES2ImplementationTest, TexImage2DViaTexSubImage2D) { | 2350 TEST_F(GLES2ImplementationTest, TexImage2DViaTexSubImage2D) { |
2374 // Set limit to 1 to effectively disable mapped memory. | 2351 // Set limit to 1 to effectively disable mapped memory. |
2375 SetMappedMemoryLimit(1); | 2352 SetMappedMemoryLimit(1); |
2376 | 2353 |
2377 struct Cmds { | 2354 struct Cmds { |
2378 cmds::TexImage2D tex_image_2d; | 2355 cmds::TexImage2D tex_image_2d; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2431 // kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, | 2408 // kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, |
2432 // false, pixels.get(), | 2409 // false, pixels.get(), |
2433 // GetExpectedTransferAddressFromOffsetAs<uint8>(offset1, half_size))) | 2410 // GetExpectedTransferAddressFromOffsetAs<uint8>(offset1, half_size))) |
2434 // .RetiresOnSaturation(); | 2411 // .RetiresOnSaturation(); |
2435 | 2412 |
2436 gl_->TexImage2D( | 2413 gl_->TexImage2D( |
2437 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | 2414 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, |
2438 pixels.get()); | 2415 pixels.get()); |
2439 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2416 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2440 EXPECT_TRUE(CheckRect( | 2417 EXPECT_TRUE(CheckRect( |
2441 kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, false, | 2418 kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, |
2442 pixels.get() + kHeight / 2 * padded_row_size, mem2.ptr)); | 2419 pixels.get() + kHeight / 2 * padded_row_size, mem2.ptr)); |
2443 | |
2444 ClearCommands(); | |
2445 gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); | |
2446 const void* commands2 = GetPut(); | |
2447 ExpectedMemoryInfo mem3 = GetExpectedMemory(half_size); | |
2448 ExpectedMemoryInfo mem4 = GetExpectedMemory(half_size); | |
2449 expected.tex_image_2d.Init( | |
2450 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, | |
2451 0, 0); | |
2452 expected.tex_sub_image_2d1.Init( | |
2453 kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType, | |
2454 mem3.id, mem3.offset, true); | |
2455 expected.set_token1.Init(GetNextToken()); | |
2456 expected.tex_sub_image_2d2.Init( | |
2457 kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType, | |
2458 mem4.id, mem4.offset, true); | |
2459 expected.set_token2.Init(GetNextToken()); | |
2460 | |
2461 // TODO(gman): Make it possible to run this test | |
2462 // EXPECT_CALL(*command_buffer(), OnFlush()) | |
2463 // .WillOnce(CheckRectAction( | |
2464 // kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, | |
2465 // true, pixels.get(), | |
2466 // GetExpectedTransferAddressFromOffsetAs<uint8>(offset3, half_size))) | |
2467 // .RetiresOnSaturation(); | |
2468 | |
2469 gl_->TexImage2D( | |
2470 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | |
2471 pixels.get()); | |
2472 EXPECT_EQ(0, memcmp(&expected, commands2, sizeof(expected))); | |
2473 EXPECT_TRUE(CheckRect( | |
2474 kWidth, kHeight / 2, kFormat, kType, kPixelStoreUnpackAlignment, true, | |
2475 pixels.get() + kHeight / 2 * padded_row_size, mem4.ptr)); | |
2476 } | |
2477 | |
2478 // Test TexSubImage2D with GL_PACK_FLIP_Y set and partial multirow transfers | |
2479 TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) { | |
2480 const GLsizei kTextureWidth = MaxTransferBufferSize() / 4; | |
2481 const GLsizei kTextureHeight = 7; | |
2482 const GLsizei kSubImageWidth = MaxTransferBufferSize() / 8; | |
2483 const GLsizei kSubImageHeight = 4; | |
2484 const GLint kSubImageXOffset = 1; | |
2485 const GLint kSubImageYOffset = 2; | |
2486 const GLenum kFormat = GL_RGBA; | |
2487 const GLenum kType = GL_UNSIGNED_BYTE; | |
2488 const GLenum kTarget = GL_TEXTURE_2D; | |
2489 const GLint kLevel = 0; | |
2490 const GLint kBorder = 0; | |
2491 const GLint kPixelStoreUnpackAlignment = 4; | |
2492 | |
2493 struct Cmds { | |
2494 cmds::PixelStorei pixel_store_i1; | |
2495 cmds::TexImage2D tex_image_2d; | |
2496 cmds::PixelStorei pixel_store_i2; | |
2497 cmds::TexSubImage2D tex_sub_image_2d1; | |
2498 cmd::SetToken set_token1; | |
2499 cmds::TexSubImage2D tex_sub_image_2d2; | |
2500 cmd::SetToken set_token2; | |
2501 }; | |
2502 | |
2503 uint32 sub_2_high_size = 0; | |
2504 ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( | |
2505 kSubImageWidth, 2, 1, kFormat, kType, kPixelStoreUnpackAlignment, | |
2506 &sub_2_high_size, NULL, NULL)); | |
2507 | |
2508 ExpectedMemoryInfo mem1 = GetExpectedMemory(sub_2_high_size); | |
2509 ExpectedMemoryInfo mem2 = GetExpectedMemory(sub_2_high_size); | |
2510 | |
2511 Cmds expected; | |
2512 expected.pixel_store_i1.Init(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment); | |
2513 expected.tex_image_2d.Init( | |
2514 kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kFormat, | |
2515 kType, 0, 0); | |
2516 expected.pixel_store_i2.Init(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); | |
2517 expected.tex_sub_image_2d1.Init(kTarget, kLevel, kSubImageXOffset, | |
2518 kSubImageYOffset + 2, kSubImageWidth, 2, kFormat, kType, | |
2519 mem1.id, mem1.offset, false); | |
2520 expected.set_token1.Init(GetNextToken()); | |
2521 expected.tex_sub_image_2d2.Init(kTarget, kLevel, kSubImageXOffset, | |
2522 kSubImageYOffset, kSubImageWidth , 2, kFormat, kType, | |
2523 mem2.id, mem2.offset, false); | |
2524 expected.set_token2.Init(GetNextToken()); | |
2525 | |
2526 gl_->PixelStorei(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment); | |
2527 gl_->TexImage2D( | |
2528 kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kBorder, kFormat, | |
2529 kType, NULL); | |
2530 gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); | |
2531 scoped_ptr<uint32[]> pixels(new uint32[kSubImageWidth * kSubImageHeight]); | |
2532 for (int y = 0; y < kSubImageHeight; ++y) { | |
2533 for (int x = 0; x < kSubImageWidth; ++x) { | |
2534 pixels.get()[kSubImageWidth * y + x] = x | (y << 16); | |
2535 } | |
2536 } | |
2537 gl_->TexSubImage2D( | |
2538 GL_TEXTURE_2D, 0, kSubImageXOffset, kSubImageYOffset, kSubImageWidth, | |
2539 kSubImageHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels.get()); | |
2540 | |
2541 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | |
2542 EXPECT_TRUE(CheckRect( | |
2543 kSubImageWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, true, | |
2544 reinterpret_cast<uint8*>(pixels.get() + 2 * kSubImageWidth), | |
2545 mem2.ptr)); | |
2546 } | 2420 } |
2547 | 2421 |
2548 TEST_F(GLES2ImplementationTest, SubImageUnpack) { | 2422 TEST_F(GLES2ImplementationTest, SubImageUnpack) { |
2549 static const GLint unpack_alignments[] = { 1, 2, 4, 8 }; | 2423 static const GLint unpack_alignments[] = { 1, 2, 4, 8 }; |
2550 | 2424 |
2551 static const GLenum kFormat = GL_RGB; | 2425 static const GLenum kFormat = GL_RGB; |
2552 static const GLenum kType = GL_UNSIGNED_BYTE; | 2426 static const GLenum kType = GL_UNSIGNED_BYTE; |
2553 static const GLint kLevel = 0; | 2427 static const GLint kLevel = 0; |
2554 static const GLint kBorder = 0; | 2428 static const GLint kBorder = 0; |
2555 // We're testing using the unpack params to pull a subimage out of a larger | 2429 // We're testing using the unpack params to pull a subimage out of a larger |
2556 // source of pixels. Here we specify the subimage by its border rows / | 2430 // source of pixels. Here we specify the subimage by its border rows / |
2557 // columns. | 2431 // columns. |
2558 static const GLint kSrcWidth = 33; | 2432 static const GLint kSrcWidth = 33; |
2559 static const GLint kSrcSubImageX0 = 11; | 2433 static const GLint kSrcSubImageX0 = 11; |
2560 static const GLint kSrcSubImageX1 = 20; | 2434 static const GLint kSrcSubImageX1 = 20; |
2561 static const GLint kSrcSubImageY0 = 18; | 2435 static const GLint kSrcSubImageY0 = 18; |
2562 static const GLint kSrcSubImageY1 = 23; | 2436 static const GLint kSrcSubImageY1 = 23; |
2563 static const GLint kSrcSubImageWidth = kSrcSubImageX1 - kSrcSubImageX0; | 2437 static const GLint kSrcSubImageWidth = kSrcSubImageX1 - kSrcSubImageX0; |
2564 static const GLint kSrcSubImageHeight = kSrcSubImageY1 - kSrcSubImageY0; | 2438 static const GLint kSrcSubImageHeight = kSrcSubImageY1 - kSrcSubImageY0; |
2565 | 2439 |
2566 // these are only used in the texsubimage tests | 2440 // these are only used in the texsubimage tests |
2567 static const GLint kTexWidth = 1023; | 2441 static const GLint kTexWidth = 1023; |
2568 static const GLint kTexHeight = 511; | 2442 static const GLint kTexHeight = 511; |
2569 static const GLint kTexSubXOffset = 419; | 2443 static const GLint kTexSubXOffset = 419; |
2570 static const GLint kTexSubYOffset = 103; | 2444 static const GLint kTexSubYOffset = 103; |
2571 | 2445 |
2572 struct { | 2446 struct { |
2573 cmds::PixelStorei pixel_store_i; | 2447 cmds::PixelStorei pixel_store_i; |
2574 cmds::PixelStorei pixel_store_i2; | |
2575 cmds::TexImage2D tex_image_2d; | 2448 cmds::TexImage2D tex_image_2d; |
2576 } texImageExpected; | 2449 } texImageExpected; |
2577 | 2450 |
2578 struct { | 2451 struct { |
2579 cmds::PixelStorei pixel_store_i; | 2452 cmds::PixelStorei pixel_store_i; |
2580 cmds::PixelStorei pixel_store_i2; | |
2581 cmds::TexImage2D tex_image_2d; | 2453 cmds::TexImage2D tex_image_2d; |
2582 cmds::TexSubImage2D tex_sub_image_2d; | 2454 cmds::TexSubImage2D tex_sub_image_2d; |
2583 } texSubImageExpected; | 2455 } texSubImageExpected; |
2584 | 2456 |
2585 uint32 src_size; | 2457 uint32 src_size; |
2586 ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( | 2458 ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
2587 kSrcWidth, kSrcSubImageY1, 1, kFormat, kType, 8, &src_size, NULL, NULL)); | 2459 kSrcWidth, kSrcSubImageY1, 1, kFormat, kType, 8, &src_size, NULL, NULL)); |
2588 scoped_ptr<uint8[]> src_pixels; | 2460 scoped_ptr<uint8[]> src_pixels; |
2589 src_pixels.reset(new uint8[src_size]); | 2461 src_pixels.reset(new uint8[src_size]); |
2590 for (size_t i = 0; i < src_size; ++i) { | 2462 for (size_t i = 0; i < src_size; ++i) { |
2591 src_pixels[i] = static_cast<int8>(i); | 2463 src_pixels[i] = static_cast<int8>(i); |
2592 } | 2464 } |
2593 | 2465 |
2594 for (int sub = 0; sub < 2; ++sub) { | 2466 for (int sub = 0; sub < 2; ++sub) { |
2595 for (int flip_y = 0; flip_y < 2; ++flip_y) { | 2467 for (size_t a = 0; a < arraysize(unpack_alignments); ++a) { |
2596 for (size_t a = 0; a < arraysize(unpack_alignments); ++a) { | 2468 GLint alignment = unpack_alignments[a]; |
2597 GLint alignment = unpack_alignments[a]; | 2469 uint32 size; |
2598 uint32 size; | 2470 uint32 unpadded_row_size; |
2599 uint32 unpadded_row_size; | 2471 uint32 padded_row_size; |
2600 uint32 padded_row_size; | 2472 ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( |
2601 ASSERT_TRUE(GLES2Util::ComputeImageDataSizes( | 2473 kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, alignment, |
2602 kSrcSubImageWidth, kSrcSubImageHeight, 1, kFormat, kType, alignment, | 2474 &size, &unpadded_row_size, &padded_row_size)); |
2603 &size, &unpadded_row_size, &padded_row_size)); | 2475 ASSERT_TRUE(size <= MaxTransferBufferSize()); |
2604 ASSERT_TRUE(size <= MaxTransferBufferSize()); | 2476 ExpectedMemoryInfo mem = GetExpectedMemory(size); |
2605 ExpectedMemoryInfo mem = GetExpectedMemory(size); | |
2606 | 2477 |
2607 const void* commands = GetPut(); | 2478 const void* commands = GetPut(); |
2608 gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment); | 2479 gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment); |
2609 gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); | 2480 gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); |
2610 gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); | 2481 gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); |
2611 gl_->PixelStorei(GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); | 2482 gl_->PixelStorei(GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); |
2612 gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); | 2483 if (sub) { |
2613 if (sub) { | 2484 gl_->TexImage2D( |
2614 gl_->TexImage2D( | 2485 GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder, |
2615 GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder, | 2486 kFormat, kType, NULL); |
2616 kFormat, kType, NULL); | 2487 gl_->TexSubImage2D( |
2617 gl_->TexSubImage2D( | 2488 GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, |
2618 GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, | 2489 kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, |
2619 kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, | 2490 src_pixels.get()); |
2620 src_pixels.get()); | 2491 texSubImageExpected.pixel_store_i.Init( |
2621 texSubImageExpected.pixel_store_i.Init( | 2492 GL_UNPACK_ALIGNMENT, alignment); |
2622 GL_UNPACK_ALIGNMENT, alignment); | 2493 texSubImageExpected.tex_image_2d.Init( |
2623 texSubImageExpected.pixel_store_i2.Init( | 2494 GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, |
2624 GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); | 2495 kFormat, kType, 0, 0); |
2625 texSubImageExpected.tex_image_2d.Init( | 2496 texSubImageExpected.tex_sub_image_2d.Init( |
2626 GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, | 2497 GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, |
2627 kFormat, kType, 0, 0); | 2498 kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id, |
2628 texSubImageExpected.tex_sub_image_2d.Init( | 2499 mem.offset, GL_FALSE); |
2629 GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, | 2500 EXPECT_EQ(0, memcmp( |
2630 kSrcSubImageWidth, kSrcSubImageHeight, kFormat, kType, mem.id, | 2501 &texSubImageExpected, commands, sizeof(texSubImageExpected))); |
2631 mem.offset, GL_FALSE); | 2502 } else { |
2632 EXPECT_EQ(0, memcmp( | 2503 gl_->TexImage2D( |
2633 &texSubImageExpected, commands, sizeof(texSubImageExpected))); | 2504 GL_TEXTURE_2D, kLevel, kFormat, |
2634 } else { | 2505 kSrcSubImageWidth, kSrcSubImageHeight, kBorder, kFormat, kType, |
2635 gl_->TexImage2D( | 2506 src_pixels.get()); |
2636 GL_TEXTURE_2D, kLevel, kFormat, | 2507 texImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment); |
2637 kSrcSubImageWidth, kSrcSubImageHeight, kBorder, kFormat, kType, | 2508 texImageExpected.tex_image_2d.Init( |
2638 src_pixels.get()); | 2509 GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, |
2639 texImageExpected.pixel_store_i.Init(GL_UNPACK_ALIGNMENT, alignment); | 2510 kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset); |
2640 texImageExpected.pixel_store_i2.Init( | 2511 EXPECT_EQ(0, memcmp( |
2641 GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); | 2512 &texImageExpected, commands, sizeof(texImageExpected))); |
2642 texImageExpected.tex_image_2d.Init( | |
2643 GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, | |
2644 kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset); | |
2645 EXPECT_EQ(0, memcmp( | |
2646 &texImageExpected, commands, sizeof(texImageExpected))); | |
2647 } | |
2648 uint32 src_padded_row_size; | |
2649 ASSERT_TRUE(GLES2Util::ComputeImagePaddedRowSize( | |
2650 kSrcWidth, kFormat, kType, alignment, &src_padded_row_size)); | |
2651 uint32 bytes_per_group = GLES2Util::ComputeImageGroupSize( | |
2652 kFormat, kType); | |
2653 for (int y = 0; y < kSrcSubImageHeight; ++y) { | |
2654 GLint src_sub_y = flip_y ? kSrcSubImageHeight - y - 1 : y; | |
2655 const uint8* src_row = src_pixels.get() + | |
2656 (kSrcSubImageY0 + src_sub_y) * src_padded_row_size + | |
2657 bytes_per_group * kSrcSubImageX0; | |
2658 const uint8* dst_row = mem.ptr + y * padded_row_size; | |
2659 EXPECT_EQ(0, memcmp(src_row, dst_row, unpadded_row_size)); | |
2660 } | |
2661 ClearCommands(); | |
2662 } | 2513 } |
| 2514 uint32 src_padded_row_size; |
| 2515 ASSERT_TRUE(GLES2Util::ComputeImagePaddedRowSize( |
| 2516 kSrcWidth, kFormat, kType, alignment, &src_padded_row_size)); |
| 2517 uint32 bytes_per_group = GLES2Util::ComputeImageGroupSize( |
| 2518 kFormat, kType); |
| 2519 for (int y = 0; y < kSrcSubImageHeight; ++y) { |
| 2520 const uint8* src_row = src_pixels.get() + |
| 2521 (kSrcSubImageY0 + y) * src_padded_row_size + |
| 2522 bytes_per_group * kSrcSubImageX0; |
| 2523 const uint8* dst_row = mem.ptr + y * padded_row_size; |
| 2524 EXPECT_EQ(0, memcmp(src_row, dst_row, unpadded_row_size)); |
| 2525 } |
| 2526 ClearCommands(); |
2663 } | 2527 } |
2664 } | 2528 } |
2665 } | 2529 } |
2666 | 2530 |
2667 // Test texture related calls with invalid arguments. | 2531 // Test texture related calls with invalid arguments. |
2668 TEST_F(GLES2ImplementationTest, TextureInvalidArguments) { | 2532 TEST_F(GLES2ImplementationTest, TextureInvalidArguments) { |
2669 struct Cmds { | 2533 struct Cmds { |
2670 cmds::TexImage2D tex_image_2d; | 2534 cmds::TexImage2D tex_image_2d; |
2671 cmd::SetToken set_token; | 2535 cmd::SetToken set_token; |
2672 }; | 2536 }; |
(...skipping 20 matching lines...) Expand all Loading... |
2693 Cmds expected; | 2557 Cmds expected; |
2694 expected.tex_image_2d.Init( | 2558 expected.tex_image_2d.Init( |
2695 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, | 2559 kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, |
2696 mem1.id, mem1.offset); | 2560 mem1.id, mem1.offset); |
2697 expected.set_token.Init(GetNextToken()); | 2561 expected.set_token.Init(GetNextToken()); |
2698 gl_->TexImage2D( | 2562 gl_->TexImage2D( |
2699 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, | 2563 kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, |
2700 pixels); | 2564 pixels); |
2701 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2565 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2702 EXPECT_TRUE(CheckRect( | 2566 EXPECT_TRUE(CheckRect( |
2703 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, | 2567 kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, |
2704 pixels, mem1.ptr)); | 2568 pixels, mem1.ptr)); |
2705 | 2569 |
2706 ClearCommands(); | 2570 ClearCommands(); |
2707 | 2571 |
2708 // Use invalid border. | 2572 // Use invalid border. |
2709 gl_->TexImage2D( | 2573 gl_->TexImage2D( |
2710 kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, | 2574 kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, |
2711 pixels); | 2575 pixels); |
2712 | 2576 |
2713 EXPECT_TRUE(NoCommandsWritten()); | 2577 EXPECT_TRUE(NoCommandsWritten()); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2787 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, | 2651 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, |
2788 kFormat, kType, mem.id, mem.offset); | 2652 kFormat, kType, mem.id, mem.offset); |
2789 | 2653 |
2790 gl_->TexImage3D( | 2654 gl_->TexImage3D( |
2791 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, kBorder, | 2655 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, kBorder, |
2792 kFormat, kType, pixels.get()); | 2656 kFormat, kType, pixels.get()); |
2793 | 2657 |
2794 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2658 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2795 EXPECT_TRUE(CheckRect( | 2659 EXPECT_TRUE(CheckRect( |
2796 kWidth, kHeight * kDepth, kFormat, kType, kPixelStoreUnpackAlignment, | 2660 kWidth, kHeight * kDepth, kFormat, kType, kPixelStoreUnpackAlignment, |
2797 false, reinterpret_cast<uint8*>(pixels.get()), mem.ptr)); | 2661 reinterpret_cast<uint8*>(pixels.get()), mem.ptr)); |
2798 } | 2662 } |
2799 | 2663 |
2800 TEST_F(GLES2ImplementationTest, TexImage3DViaMappedMem) { | 2664 TEST_F(GLES2ImplementationTest, TexImage3DViaMappedMem) { |
2801 struct Cmds { | 2665 struct Cmds { |
2802 cmds::TexImage3D tex_image_3d; | 2666 cmds::TexImage3D tex_image_3d; |
2803 }; | 2667 }; |
2804 const GLenum kTarget = GL_TEXTURE_3D; | 2668 const GLenum kTarget = GL_TEXTURE_3D; |
2805 const GLint kLevel = 0; | 2669 const GLint kLevel = 0; |
2806 const GLint kBorder = 0; | 2670 const GLint kBorder = 0; |
2807 const GLenum kFormat = GL_RGB; | 2671 const GLenum kFormat = GL_RGB; |
(...skipping 27 matching lines...) Expand all Loading... |
2835 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, | 2699 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, |
2836 kFormat, kType, mem.id, mem.offset); | 2700 kFormat, kType, mem.id, mem.offset); |
2837 | 2701 |
2838 gl_->TexImage3D( | 2702 gl_->TexImage3D( |
2839 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, kBorder, | 2703 kTarget, kLevel, kFormat, kWidth, kHeight, kDepth, kBorder, |
2840 kFormat, kType, pixels.get()); | 2704 kFormat, kType, pixels.get()); |
2841 | 2705 |
2842 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2706 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2843 EXPECT_TRUE(CheckRect( | 2707 EXPECT_TRUE(CheckRect( |
2844 kWidth, kHeight * kDepth, kFormat, kType, kPixelStoreUnpackAlignment, | 2708 kWidth, kHeight * kDepth, kFormat, kType, kPixelStoreUnpackAlignment, |
2845 false, reinterpret_cast<uint8*>(pixels.get()), mem.ptr)); | 2709 reinterpret_cast<uint8*>(pixels.get()), mem.ptr)); |
2846 } | 2710 } |
2847 | 2711 |
2848 TEST_F(GLES2ImplementationTest, TexImage3DViaTexSubImage3D) { | 2712 TEST_F(GLES2ImplementationTest, TexImage3DViaTexSubImage3D) { |
2849 // Set limit to 1 to effectively disable mapped memory. | 2713 // Set limit to 1 to effectively disable mapped memory. |
2850 SetMappedMemoryLimit(1); | 2714 SetMappedMemoryLimit(1); |
2851 | 2715 |
2852 struct Cmds { | 2716 struct Cmds { |
2853 cmds::TexImage3D tex_image_3d; | 2717 cmds::TexImage3D tex_image_3d; |
2854 cmds::TexSubImage3D tex_sub_image_3d1; | 2718 cmds::TexSubImage3D tex_sub_image_3d1; |
2855 cmd::SetToken set_token; | 2719 cmd::SetToken set_token; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2969 expected.set_token2.Init(GetNextToken()); | 2833 expected.set_token2.Init(GetNextToken()); |
2970 expected.set_token3.Init(GetNextToken()); | 2834 expected.set_token3.Init(GetNextToken()); |
2971 | 2835 |
2972 gl_->TexSubImage3D( | 2836 gl_->TexSubImage3D( |
2973 kTarget, kLevel, kXOffset, kYOffset, kZOffset, kWidth, kHeight, kDepth, | 2837 kTarget, kLevel, kXOffset, kYOffset, kZOffset, kWidth, kHeight, kDepth, |
2974 kFormat, kType, pixels.get()); | 2838 kFormat, kType, pixels.get()); |
2975 | 2839 |
2976 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); | 2840 EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); |
2977 uint32 offset_to_last = first_size + second_size + third_size; | 2841 uint32 offset_to_last = first_size + second_size + third_size; |
2978 EXPECT_TRUE(CheckRect( | 2842 EXPECT_TRUE(CheckRect( |
2979 kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, false, | 2843 kWidth, 2, kFormat, kType, kPixelStoreUnpackAlignment, |
2980 reinterpret_cast<uint8*>(pixels.get()) + offset_to_last, mem2_2.ptr)); | 2844 reinterpret_cast<uint8*>(pixels.get()) + offset_to_last, mem2_2.ptr)); |
2981 } | 2845 } |
2982 | 2846 |
2983 // glGen* Ids must not be reused until glDelete* commands have been | 2847 // glGen* Ids must not be reused until glDelete* commands have been |
2984 // flushed by glFlush. | 2848 // flushed by glFlush. |
2985 TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestBuffers) { | 2849 TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestBuffers) { |
2986 FlushGenerationTest<GenBuffersAPI>(); | 2850 FlushGenerationTest<GenBuffersAPI>(); |
2987 } | 2851 } |
2988 TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestFramebuffers) { | 2852 TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestFramebuffers) { |
2989 FlushGenerationTest<GenFramebuffersAPI>(); | 2853 FlushGenerationTest<GenFramebuffersAPI>(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3028 CrossContextGenerationAutoFlushTest<GenRenderbuffersAPI>(); | 2892 CrossContextGenerationAutoFlushTest<GenRenderbuffersAPI>(); |
3029 } | 2893 } |
3030 TEST_F(GLES2ImplementationStrictSharedTest, | 2894 TEST_F(GLES2ImplementationStrictSharedTest, |
3031 CrossContextGenerationAutoFlushTestTextures) { | 2895 CrossContextGenerationAutoFlushTestTextures) { |
3032 CrossContextGenerationAutoFlushTest<GenTexturesAPI>(); | 2896 CrossContextGenerationAutoFlushTest<GenTexturesAPI>(); |
3033 } | 2897 } |
3034 | 2898 |
3035 TEST_F(GLES2ImplementationTest, GetString) { | 2899 TEST_F(GLES2ImplementationTest, GetString) { |
3036 const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 2900 const uint32 kBucketId = GLES2Implementation::kResultBucketId; |
3037 const Str7 kString = {"foobar"}; | 2901 const Str7 kString = {"foobar"}; |
3038 // GL_CHROMIUM_map_sub GL_CHROMIUM_flipy are hard coded into | 2902 // GL_CHROMIUM_map_sub is hard coded into GLES2Implementation. |
3039 // GLES2Implementation. | |
3040 const char* expected_str = | 2903 const char* expected_str = |
3041 "foobar " | 2904 "foobar " |
3042 "GL_CHROMIUM_flipy " | |
3043 "GL_EXT_unpack_subimage " | 2905 "GL_EXT_unpack_subimage " |
3044 "GL_CHROMIUM_map_sub"; | 2906 "GL_CHROMIUM_map_sub"; |
3045 const char kBad = 0x12; | 2907 const char kBad = 0x12; |
3046 struct Cmds { | 2908 struct Cmds { |
3047 cmd::SetBucketSize set_bucket_size1; | 2909 cmd::SetBucketSize set_bucket_size1; |
3048 cmds::GetString get_string; | 2910 cmds::GetString get_string; |
3049 cmd::GetBucketStart get_bucket_start; | 2911 cmd::GetBucketStart get_bucket_start; |
3050 cmd::SetToken set_token1; | 2912 cmd::SetToken set_token1; |
3051 cmd::SetBucketSize set_bucket_size2; | 2913 cmd::SetBucketSize set_bucket_size2; |
3052 }; | 2914 }; |
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3939 TEST_F(GLES2ImplementationManualInitTest, FailInitOnTransferBufferFail) { | 3801 TEST_F(GLES2ImplementationManualInitTest, FailInitOnTransferBufferFail) { |
3940 ContextInitOptions init_options; | 3802 ContextInitOptions init_options; |
3941 init_options.transfer_buffer_initialize_fail = true; | 3803 init_options.transfer_buffer_initialize_fail = true; |
3942 EXPECT_FALSE(Initialize(init_options)); | 3804 EXPECT_FALSE(Initialize(init_options)); |
3943 } | 3805 } |
3944 | 3806 |
3945 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" | 3807 #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" |
3946 | 3808 |
3947 } // namespace gles2 | 3809 } // namespace gles2 |
3948 } // namespace gpu | 3810 } // namespace gpu |
OLD | NEW |