1 /* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <gtest/gtest.h> 18 19 #include <renderengine/RenderEngine.h> 20 #include <sync/sync.h> 21 #include <ui/PixelFormat.h> 22 #include "../gl/GLESRenderEngine.h" 23 24 constexpr int DEFAULT_DISPLAY_WIDTH = 128; 25 constexpr int DEFAULT_DISPLAY_HEIGHT = 256; 26 constexpr int DEFAULT_DISPLAY_OFFSET = 64; 27 28 namespace android { 29 30 struct RenderEngineTest : public ::testing::Test { 31 static void SetUpTestSuite() { 32 sRE = renderengine::gl::GLESRenderEngine::create(static_cast<int32_t>( 33 ui::PixelFormat::RGBA_8888), 34 0, 1); 35 } 36 37 static void TearDownTestSuite() { 38 // The ordering here is important - sCurrentBuffer must live longer 39 // than RenderEngine to avoid a null reference on tear-down. 40 sRE = nullptr; 41 sCurrentBuffer = nullptr; 42 } 43 44 static sp<GraphicBuffer> allocateDefaultBuffer() { 45 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, 46 HAL_PIXEL_FORMAT_RGBA_8888, 1, 47 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN | 48 GRALLOC_USAGE_HW_RENDER, 49 "output"); 50 } 51 52 // Allocates a 1x1 buffer to fill with a solid color 53 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) { 54 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1, 55 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN | 56 GRALLOC_USAGE_HW_TEXTURE, 57 "input"); 58 } 59 60 RenderEngineTest() { mBuffer = allocateDefaultBuffer(); } 61 62 ~RenderEngineTest() { 63 for (uint32_t texName : mTexNames) { 64 sRE->deleteTextures(1, &texName); 65 } 66 } 67 68 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a, 69 uint8_t tolerance = 0) { 70 uint8_t* pixels; 71 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 72 reinterpret_cast<void**>(&pixels)); 73 74 auto colorCompare = [tolerance](uint8_t a, uint8_t b) { 75 uint8_t tmp = a >= b ? a - b : b - a; 76 return tmp <= tolerance; 77 }; 78 int32_t maxFails = 10; 79 int32_t fails = 0; 80 for (int32_t j = 0; j < region.getHeight(); j++) { 81 const uint8_t* src = 82 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4; 83 for (int32_t i = 0; i < region.getWidth(); i++) { 84 const uint8_t expected[4] = {r, g, b, a}; 85 bool equal = std::equal(src, src + 4, expected, colorCompare); 86 EXPECT_TRUE(equal) 87 << "pixel @ (" << region.left + i << ", " << region.top + j << "): " 88 << "expected (" << static_cast<uint32_t>(r) << ", " 89 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", " 90 << static_cast<uint32_t>(a) << "), " 91 << "got (" << static_cast<uint32_t>(src[0]) << ", " 92 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2]) 93 << ", " << static_cast<uint32_t>(src[3]) << ")"; 94 src += 4; 95 if (!equal && ++fails >= maxFails) { 96 break; 97 } 98 } 99 if (fails >= maxFails) { 100 break; 101 } 102 } 103 mBuffer->unlock(); 104 } 105 106 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); } 107 108 static Rect offsetRect() { 109 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH, 110 DEFAULT_DISPLAY_HEIGHT); 111 } 112 113 static Rect offsetRectAtZero() { 114 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET, 115 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET); 116 } 117 118 void invokeDraw(renderengine::DisplaySettings settings, 119 std::vector<renderengine::LayerSettings> layers, sp<GraphicBuffer> buffer) { 120 base::unique_fd fence; 121 status_t status = sRE->drawLayers(settings, layers, buffer->getNativeBuffer(), true, 122 base::unique_fd(), &fence); 123 sCurrentBuffer = buffer; 124 125 int fd = fence.release(); 126 if (fd >= 0) { 127 sync_wait(fd, -1); 128 close(fd); 129 } 130 131 ASSERT_EQ(NO_ERROR, status); 132 if (layers.size() > 0) { 133 ASSERT_TRUE(sRE->isFramebufferImageCachedForTesting(buffer->getId())); 134 } 135 } 136 137 void drawEmptyLayers() { 138 renderengine::DisplaySettings settings; 139 std::vector<renderengine::LayerSettings> layers; 140 // Meaningless buffer since we don't do any drawing 141 sp<GraphicBuffer> buffer = new GraphicBuffer(); 142 invokeDraw(settings, layers, buffer); 143 } 144 145 template <typename SourceVariant> 146 void fillBuffer(half r, half g, half b, half a); 147 148 template <typename SourceVariant> 149 void fillRedBuffer(); 150 151 template <typename SourceVariant> 152 void fillGreenBuffer(); 153 154 template <typename SourceVariant> 155 void fillBlueBuffer(); 156 157 template <typename SourceVariant> 158 void fillRedTransparentBuffer(); 159 160 template <typename SourceVariant> 161 void fillRedOffsetBuffer(); 162 163 template <typename SourceVariant> 164 void fillBufferPhysicalOffset(); 165 166 template <typename SourceVariant> 167 void fillBufferCheckers(mat4 transform); 168 169 template <typename SourceVariant> 170 void fillBufferCheckersRotate0(); 171 172 template <typename SourceVariant> 173 void fillBufferCheckersRotate90(); 174 175 template <typename SourceVariant> 176 void fillBufferCheckersRotate180(); 177 178 template <typename SourceVariant> 179 void fillBufferCheckersRotate270(); 180 181 template <typename SourceVariant> 182 void fillBufferWithLayerTransform(); 183 184 template <typename SourceVariant> 185 void fillBufferLayerTransform(); 186 187 template <typename SourceVariant> 188 void fillBufferWithColorTransform(); 189 190 template <typename SourceVariant> 191 void fillBufferColorTransform(); 192 193 template <typename SourceVariant> 194 void fillRedBufferWithRoundedCorners(); 195 196 template <typename SourceVariant> 197 void fillBufferWithRoundedCorners(); 198 199 template <typename SourceVariant> 200 void overlayCorners(); 201 202 void fillRedBufferTextureTransform(); 203 204 void fillBufferTextureTransform(); 205 206 void fillRedBufferWithPremultiplyAlpha(); 207 208 void fillBufferWithPremultiplyAlpha(); 209 210 void fillRedBufferWithoutPremultiplyAlpha(); 211 212 void fillBufferWithoutPremultiplyAlpha(); 213 214 void fillGreenColorBufferThenClearRegion(); 215 216 void clearLeftRegion(); 217 218 void clearRegion(); 219 220 // Keep around the same renderengine object to save on initialization time. 221 // For now, exercise the GL backend directly so that some caching specifics 222 // can be tested without changing the interface. 223 static std::unique_ptr<renderengine::gl::GLESRenderEngine> sRE; 224 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to 225 // be freed *after* RenderEngine is destroyed, so that the EGL image is 226 // destroyed first. 227 static sp<GraphicBuffer> sCurrentBuffer; 228 229 sp<GraphicBuffer> mBuffer; 230 231 std::vector<uint32_t> mTexNames; 232 }; 233 234 std::unique_ptr<renderengine::gl::GLESRenderEngine> RenderEngineTest::sRE = nullptr; 235 sp<GraphicBuffer> RenderEngineTest::sCurrentBuffer = nullptr; 236 237 struct ColorSourceVariant { 238 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b, 239 RenderEngineTest* /*fixture*/) { 240 layer.source.solidColor = half3(r, g, b); 241 } 242 }; 243 244 struct RelaxOpaqueBufferVariant { 245 static void setOpaqueBit(renderengine::LayerSettings& layer) { 246 layer.source.buffer.isOpaque = false; 247 } 248 249 static uint8_t getAlphaChannel() { return 255; } 250 }; 251 252 struct ForceOpaqueBufferVariant { 253 static void setOpaqueBit(renderengine::LayerSettings& layer) { 254 layer.source.buffer.isOpaque = true; 255 } 256 257 static uint8_t getAlphaChannel() { 258 // The isOpaque bit will override the alpha channel, so this should be 259 // arbitrary. 260 return 10; 261 } 262 }; 263 264 template <typename OpaquenessVariant> 265 struct BufferSourceVariant { 266 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b, 267 RenderEngineTest* fixture) { 268 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1); 269 uint32_t texName; 270 fixture->sRE->genTextures(1, &texName); 271 fixture->mTexNames.push_back(texName); 272 273 uint8_t* pixels; 274 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 275 reinterpret_cast<void**>(&pixels)); 276 277 for (int32_t j = 0; j < buf->getHeight(); j++) { 278 uint8_t* iter = pixels + (buf->getStride() * j) * 4; 279 for (int32_t i = 0; i < buf->getWidth(); i++) { 280 iter[0] = uint8_t(r * 255); 281 iter[1] = uint8_t(g * 255); 282 iter[2] = uint8_t(b * 255); 283 iter[3] = OpaquenessVariant::getAlphaChannel(); 284 iter += 4; 285 } 286 } 287 288 buf->unlock(); 289 290 layer.source.buffer.buffer = buf; 291 layer.source.buffer.textureName = texName; 292 OpaquenessVariant::setOpaqueBit(layer); 293 } 294 }; 295 296 template <typename SourceVariant> 297 void RenderEngineTest::fillBuffer(half r, half g, half b, half a) { 298 renderengine::DisplaySettings settings; 299 settings.physicalDisplay = fullscreenRect(); 300 settings.clip = fullscreenRect(); 301 302 std::vector<renderengine::LayerSettings> layers; 303 304 renderengine::LayerSettings layer; 305 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 306 SourceVariant::fillColor(layer, r, g, b, this); 307 layer.alpha = a; 308 309 layers.push_back(layer); 310 311 invokeDraw(settings, layers, mBuffer); 312 } 313 314 template <typename SourceVariant> 315 void RenderEngineTest::fillRedBuffer() { 316 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f); 317 expectBufferColor(fullscreenRect(), 255, 0, 0, 255); 318 } 319 320 template <typename SourceVariant> 321 void RenderEngineTest::fillGreenBuffer() { 322 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f); 323 expectBufferColor(fullscreenRect(), 0, 255, 0, 255); 324 } 325 326 template <typename SourceVariant> 327 void RenderEngineTest::fillBlueBuffer() { 328 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f); 329 expectBufferColor(fullscreenRect(), 0, 0, 255, 255); 330 } 331 332 template <typename SourceVariant> 333 void RenderEngineTest::fillRedTransparentBuffer() { 334 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f); 335 expectBufferColor(fullscreenRect(), 51, 0, 0, 51); 336 } 337 338 template <typename SourceVariant> 339 void RenderEngineTest::fillRedOffsetBuffer() { 340 renderengine::DisplaySettings settings; 341 settings.physicalDisplay = offsetRect(); 342 settings.clip = offsetRectAtZero(); 343 344 std::vector<renderengine::LayerSettings> layers; 345 346 renderengine::LayerSettings layer; 347 layer.geometry.boundaries = offsetRectAtZero().toFloatRect(); 348 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 349 layer.alpha = 1.0f; 350 351 layers.push_back(layer); 352 invokeDraw(settings, layers, mBuffer); 353 } 354 355 template <typename SourceVariant> 356 void RenderEngineTest::fillBufferPhysicalOffset() { 357 fillRedOffsetBuffer<SourceVariant>(); 358 359 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH, 360 DEFAULT_DISPLAY_HEIGHT), 361 255, 0, 0, 255); 362 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT); 363 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET); 364 365 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0); 366 expectBufferColor(offsetRegionTop, 0, 0, 0, 0); 367 } 368 369 template <typename SourceVariant> 370 void RenderEngineTest::fillBufferCheckers(mat4 transform) { 371 renderengine::DisplaySettings settings; 372 settings.physicalDisplay = fullscreenRect(); 373 // Here logical space is 2x2 374 settings.clip = Rect(2, 2); 375 settings.globalTransform = transform; 376 377 std::vector<renderengine::LayerSettings> layers; 378 379 renderengine::LayerSettings layerOne; 380 Rect rectOne(0, 0, 1, 1); 381 layerOne.geometry.boundaries = rectOne.toFloatRect(); 382 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this); 383 layerOne.alpha = 1.0f; 384 385 renderengine::LayerSettings layerTwo; 386 Rect rectTwo(0, 1, 1, 2); 387 layerTwo.geometry.boundaries = rectTwo.toFloatRect(); 388 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this); 389 layerTwo.alpha = 1.0f; 390 391 renderengine::LayerSettings layerThree; 392 Rect rectThree(1, 0, 2, 1); 393 layerThree.geometry.boundaries = rectThree.toFloatRect(); 394 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this); 395 layerThree.alpha = 1.0f; 396 397 layers.push_back(layerOne); 398 layers.push_back(layerTwo); 399 layers.push_back(layerThree); 400 401 invokeDraw(settings, layers, mBuffer); 402 } 403 404 template <typename SourceVariant> 405 void RenderEngineTest::fillBufferCheckersRotate0() { 406 fillBufferCheckers<SourceVariant>(mat4()); 407 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0, 408 255); 409 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH, 410 DEFAULT_DISPLAY_HEIGHT / 2), 411 0, 0, 255, 255); 412 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2, 413 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 414 0, 0, 0, 0); 415 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2, 416 DEFAULT_DISPLAY_HEIGHT), 417 0, 255, 0, 255); 418 } 419 420 template <typename SourceVariant> 421 void RenderEngineTest::fillBufferCheckersRotate90() { 422 mat4 matrix = mat4(0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1); 423 fillBufferCheckers<SourceVariant>(matrix); 424 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0, 425 255); 426 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH, 427 DEFAULT_DISPLAY_HEIGHT / 2), 428 255, 0, 0, 255); 429 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2, 430 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 431 0, 0, 255, 255); 432 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2, 433 DEFAULT_DISPLAY_HEIGHT), 434 0, 0, 0, 0); 435 } 436 437 template <typename SourceVariant> 438 void RenderEngineTest::fillBufferCheckersRotate180() { 439 mat4 matrix = mat4(-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 2, 2, 0, 1); 440 fillBufferCheckers<SourceVariant>(matrix); 441 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 442 0); 443 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH, 444 DEFAULT_DISPLAY_HEIGHT / 2), 445 0, 255, 0, 255); 446 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2, 447 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 448 255, 0, 0, 255); 449 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2, 450 DEFAULT_DISPLAY_HEIGHT), 451 0, 0, 255, 255); 452 } 453 454 template <typename SourceVariant> 455 void RenderEngineTest::fillBufferCheckersRotate270() { 456 mat4 matrix = mat4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1); 457 fillBufferCheckers<SourceVariant>(matrix); 458 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255, 459 255); 460 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH, 461 DEFAULT_DISPLAY_HEIGHT / 2), 462 0, 0, 0, 0); 463 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2, 464 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 465 0, 255, 0, 255); 466 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2, 467 DEFAULT_DISPLAY_HEIGHT), 468 255, 0, 0, 255); 469 } 470 471 template <typename SourceVariant> 472 void RenderEngineTest::fillBufferWithLayerTransform() { 473 renderengine::DisplaySettings settings; 474 settings.physicalDisplay = fullscreenRect(); 475 // Here logical space is 2x2 476 settings.clip = Rect(2, 2); 477 478 std::vector<renderengine::LayerSettings> layers; 479 480 renderengine::LayerSettings layer; 481 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 482 // Translate one pixel diagonally 483 layer.geometry.positionTransform = mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1); 484 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 485 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f); 486 layer.alpha = 1.0f; 487 488 layers.push_back(layer); 489 490 invokeDraw(settings, layers, mBuffer); 491 } 492 493 template <typename SourceVariant> 494 void RenderEngineTest::fillBufferLayerTransform() { 495 fillBufferWithLayerTransform<SourceVariant>(); 496 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0); 497 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0); 498 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2, 499 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 500 255, 0, 0, 255); 501 } 502 503 template <typename SourceVariant> 504 void RenderEngineTest::fillBufferWithColorTransform() { 505 renderengine::DisplaySettings settings; 506 settings.physicalDisplay = fullscreenRect(); 507 settings.clip = Rect(1, 1); 508 509 std::vector<renderengine::LayerSettings> layers; 510 511 renderengine::LayerSettings layer; 512 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 513 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this); 514 layer.alpha = 1.0f; 515 516 // construct a fake color matrix 517 // annihilate green and blue channels 518 settings.colorTransform = mat4::scale(vec4(1, 0, 0, 1)); 519 // set red channel to red + green 520 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); 521 522 layer.alpha = 1.0f; 523 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 524 525 layers.push_back(layer); 526 527 invokeDraw(settings, layers, mBuffer); 528 } 529 530 template <typename SourceVariant> 531 void RenderEngineTest::fillBufferColorTransform() { 532 fillBufferWithColorTransform<SourceVariant>(); 533 expectBufferColor(fullscreenRect(), 191, 0, 0, 255); 534 } 535 536 template <typename SourceVariant> 537 void RenderEngineTest::fillRedBufferWithRoundedCorners() { 538 renderengine::DisplaySettings settings; 539 settings.physicalDisplay = fullscreenRect(); 540 settings.clip = fullscreenRect(); 541 542 std::vector<renderengine::LayerSettings> layers; 543 544 renderengine::LayerSettings layer; 545 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 546 layer.geometry.roundedCornersRadius = 5.0f; 547 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect(); 548 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 549 layer.alpha = 1.0f; 550 551 layers.push_back(layer); 552 553 invokeDraw(settings, layers, mBuffer); 554 } 555 556 template <typename SourceVariant> 557 void RenderEngineTest::fillBufferWithRoundedCorners() { 558 fillRedBufferWithRoundedCorners<SourceVariant>(); 559 // Corners should be ignored... 560 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0); 561 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0); 562 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0); 563 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1, 564 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 565 0, 0, 0, 0); 566 // ...And the non-rounded portion should be red. 567 // Other pixels may be anti-aliased, so let's not check those. 568 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0, 569 255); 570 } 571 572 template <typename SourceVariant> 573 void RenderEngineTest::overlayCorners() { 574 renderengine::DisplaySettings settings; 575 settings.physicalDisplay = fullscreenRect(); 576 settings.clip = fullscreenRect(); 577 578 std::vector<renderengine::LayerSettings> layersFirst; 579 580 renderengine::LayerSettings layerOne; 581 layerOne.geometry.boundaries = 582 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0); 583 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this); 584 layerOne.alpha = 0.2; 585 586 layersFirst.push_back(layerOne); 587 invokeDraw(settings, layersFirst, mBuffer); 588 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51); 589 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1, 590 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 591 0, 0, 0, 0); 592 593 std::vector<renderengine::LayerSettings> layersSecond; 594 renderengine::LayerSettings layerTwo; 595 layerTwo.geometry.boundaries = 596 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0, 597 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); 598 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this); 599 layerTwo.alpha = 1.0f; 600 601 layersSecond.push_back(layerTwo); 602 invokeDraw(settings, layersSecond, mBuffer); 603 604 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0); 605 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1, 606 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), 607 0, 255, 0, 255); 608 } 609 610 void RenderEngineTest::fillRedBufferTextureTransform() { 611 renderengine::DisplaySettings settings; 612 settings.physicalDisplay = fullscreenRect(); 613 settings.clip = Rect(1, 1); 614 615 std::vector<renderengine::LayerSettings> layers; 616 617 renderengine::LayerSettings layer; 618 // Here will allocate a checker board texture, but transform texture 619 // coordinates so that only the upper left is applied. 620 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2); 621 uint32_t texName; 622 RenderEngineTest::sRE->genTextures(1, &texName); 623 this->mTexNames.push_back(texName); 624 625 uint8_t* pixels; 626 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 627 reinterpret_cast<void**>(&pixels)); 628 // Red top left, Green top right, Blue bottom left, Black bottom right 629 pixels[0] = 255; 630 pixels[1] = 0; 631 pixels[2] = 0; 632 pixels[3] = 255; 633 pixels[4] = 0; 634 pixels[5] = 255; 635 pixels[6] = 0; 636 pixels[7] = 255; 637 pixels[8] = 0; 638 pixels[9] = 0; 639 pixels[10] = 255; 640 pixels[11] = 255; 641 buf->unlock(); 642 643 layer.source.buffer.buffer = buf; 644 layer.source.buffer.textureName = texName; 645 // Transform coordinates to only be inside the red quadrant. 646 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1)); 647 layer.alpha = 1.0f; 648 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 649 650 layers.push_back(layer); 651 652 invokeDraw(settings, layers, mBuffer); 653 } 654 655 void RenderEngineTest::fillBufferTextureTransform() { 656 fillRedBufferTextureTransform(); 657 expectBufferColor(fullscreenRect(), 255, 0, 0, 255); 658 } 659 660 void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() { 661 renderengine::DisplaySettings settings; 662 settings.physicalDisplay = fullscreenRect(); 663 // Here logical space is 1x1 664 settings.clip = Rect(1, 1); 665 666 std::vector<renderengine::LayerSettings> layers; 667 668 renderengine::LayerSettings layer; 669 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); 670 uint32_t texName; 671 RenderEngineTest::sRE->genTextures(1, &texName); 672 this->mTexNames.push_back(texName); 673 674 uint8_t* pixels; 675 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 676 reinterpret_cast<void**>(&pixels)); 677 pixels[0] = 255; 678 pixels[1] = 0; 679 pixels[2] = 0; 680 pixels[3] = 255; 681 buf->unlock(); 682 683 layer.source.buffer.buffer = buf; 684 layer.source.buffer.textureName = texName; 685 layer.source.buffer.usePremultipliedAlpha = true; 686 layer.alpha = 0.5f; 687 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 688 689 layers.push_back(layer); 690 691 invokeDraw(settings, layers, mBuffer); 692 } 693 694 void RenderEngineTest::fillBufferWithPremultiplyAlpha() { 695 fillRedBufferWithPremultiplyAlpha(); 696 expectBufferColor(fullscreenRect(), 128, 0, 0, 128); 697 } 698 699 void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() { 700 renderengine::DisplaySettings settings; 701 settings.physicalDisplay = fullscreenRect(); 702 // Here logical space is 1x1 703 settings.clip = Rect(1, 1); 704 705 std::vector<renderengine::LayerSettings> layers; 706 707 renderengine::LayerSettings layer; 708 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); 709 uint32_t texName; 710 RenderEngineTest::sRE->genTextures(1, &texName); 711 this->mTexNames.push_back(texName); 712 713 uint8_t* pixels; 714 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN, 715 reinterpret_cast<void**>(&pixels)); 716 pixels[0] = 255; 717 pixels[1] = 0; 718 pixels[2] = 0; 719 pixels[3] = 255; 720 buf->unlock(); 721 722 layer.source.buffer.buffer = buf; 723 layer.source.buffer.textureName = texName; 724 layer.source.buffer.usePremultipliedAlpha = false; 725 layer.alpha = 0.5f; 726 layer.geometry.boundaries = Rect(1, 1).toFloatRect(); 727 728 layers.push_back(layer); 729 730 invokeDraw(settings, layers, mBuffer); 731 } 732 733 void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() { 734 fillRedBufferWithoutPremultiplyAlpha(); 735 expectBufferColor(fullscreenRect(), 128, 0, 0, 64, 1); 736 } 737 738 void RenderEngineTest::clearLeftRegion() { 739 renderengine::DisplaySettings settings; 740 settings.physicalDisplay = fullscreenRect(); 741 // Here logical space is 4x4 742 settings.clip = Rect(4, 4); 743 settings.globalTransform = mat4::scale(vec4(2, 4, 0, 1)); 744 settings.clearRegion = Region(Rect(1, 1)); 745 std::vector<renderengine::LayerSettings> layers; 746 // dummy layer, without bounds should not render anything 747 renderengine::LayerSettings layer; 748 layers.push_back(layer); 749 invokeDraw(settings, layers, mBuffer); 750 } 751 752 void RenderEngineTest::clearRegion() { 753 // Reuse mBuffer 754 clearLeftRegion(); 755 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255); 756 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH, 757 DEFAULT_DISPLAY_HEIGHT), 758 0, 0, 0, 0); 759 } 760 761 TEST_F(RenderEngineTest, drawLayers_noLayersToDraw) { 762 drawEmptyLayers(); 763 } 764 765 TEST_F(RenderEngineTest, drawLayers_nullOutputBuffer) { 766 renderengine::DisplaySettings settings; 767 std::vector<renderengine::LayerSettings> layers; 768 renderengine::LayerSettings layer; 769 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 770 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 771 layers.push_back(layer); 772 base::unique_fd fence; 773 status_t status = sRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence); 774 775 ASSERT_EQ(BAD_VALUE, status); 776 } 777 778 TEST_F(RenderEngineTest, drawLayers_nullOutputFence) { 779 renderengine::DisplaySettings settings; 780 settings.physicalDisplay = fullscreenRect(); 781 settings.clip = fullscreenRect(); 782 783 std::vector<renderengine::LayerSettings> layers; 784 renderengine::LayerSettings layer; 785 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 786 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 787 layer.alpha = 1.0; 788 layers.push_back(layer); 789 790 status_t status = sRE->drawLayers(settings, layers, mBuffer->getNativeBuffer(), true, 791 base::unique_fd(), nullptr); 792 sCurrentBuffer = mBuffer; 793 ASSERT_EQ(NO_ERROR, status); 794 expectBufferColor(fullscreenRect(), 255, 0, 0, 255); 795 } 796 797 TEST_F(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) { 798 renderengine::DisplaySettings settings; 799 settings.physicalDisplay = fullscreenRect(); 800 settings.clip = fullscreenRect(); 801 802 std::vector<renderengine::LayerSettings> layers; 803 renderengine::LayerSettings layer; 804 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 805 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 806 layer.alpha = 1.0; 807 layers.push_back(layer); 808 809 status_t status = sRE->drawLayers(settings, layers, mBuffer->getNativeBuffer(), false, 810 base::unique_fd(), nullptr); 811 sCurrentBuffer = mBuffer; 812 ASSERT_EQ(NO_ERROR, status); 813 ASSERT_FALSE(sRE->isFramebufferImageCachedForTesting(mBuffer->getId())); 814 expectBufferColor(fullscreenRect(), 255, 0, 0, 255); 815 } 816 817 TEST_F(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) { 818 fillRedBuffer<ColorSourceVariant>(); 819 } 820 821 TEST_F(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) { 822 fillGreenBuffer<ColorSourceVariant>(); 823 } 824 825 TEST_F(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) { 826 fillBlueBuffer<ColorSourceVariant>(); 827 } 828 829 TEST_F(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) { 830 fillRedTransparentBuffer<ColorSourceVariant>(); 831 } 832 833 TEST_F(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) { 834 fillBufferPhysicalOffset<ColorSourceVariant>(); 835 } 836 837 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) { 838 fillBufferCheckersRotate0<ColorSourceVariant>(); 839 } 840 841 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) { 842 fillBufferCheckersRotate90<ColorSourceVariant>(); 843 } 844 845 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) { 846 fillBufferCheckersRotate180<ColorSourceVariant>(); 847 } 848 849 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) { 850 fillBufferCheckersRotate270<ColorSourceVariant>(); 851 } 852 853 TEST_F(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) { 854 fillBufferLayerTransform<ColorSourceVariant>(); 855 } 856 857 TEST_F(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) { 858 fillBufferLayerTransform<ColorSourceVariant>(); 859 } 860 861 TEST_F(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) { 862 fillBufferWithRoundedCorners<ColorSourceVariant>(); 863 } 864 865 TEST_F(RenderEngineTest, drawLayers_overlayCorners_colorSource) { 866 overlayCorners<ColorSourceVariant>(); 867 } 868 869 TEST_F(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) { 870 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 871 } 872 873 TEST_F(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) { 874 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 875 } 876 877 TEST_F(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) { 878 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 879 } 880 881 TEST_F(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) { 882 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 883 } 884 885 TEST_F(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) { 886 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 887 } 888 889 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) { 890 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 891 } 892 893 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) { 894 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 895 } 896 897 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) { 898 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 899 } 900 901 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) { 902 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 903 } 904 905 TEST_F(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) { 906 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 907 } 908 909 TEST_F(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) { 910 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 911 } 912 913 TEST_F(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) { 914 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 915 } 916 917 TEST_F(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) { 918 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>(); 919 } 920 921 TEST_F(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) { 922 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 923 } 924 925 TEST_F(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) { 926 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 927 } 928 929 TEST_F(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) { 930 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 931 } 932 933 TEST_F(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) { 934 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 935 } 936 937 TEST_F(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) { 938 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 939 } 940 941 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) { 942 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 943 } 944 945 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) { 946 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 947 } 948 949 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) { 950 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 951 } 952 953 TEST_F(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) { 954 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 955 } 956 957 TEST_F(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) { 958 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 959 } 960 961 TEST_F(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) { 962 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 963 } 964 965 TEST_F(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) { 966 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 967 } 968 969 TEST_F(RenderEngineTest, drawLayers_overlayCorners_bufferSource) { 970 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>(); 971 } 972 973 TEST_F(RenderEngineTest, drawLayers_fillBufferTextureTransform) { 974 fillBufferTextureTransform(); 975 } 976 977 TEST_F(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) { 978 fillBufferWithPremultiplyAlpha(); 979 } 980 981 TEST_F(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) { 982 fillBufferWithoutPremultiplyAlpha(); 983 } 984 985 TEST_F(RenderEngineTest, drawLayers_clearRegion) { 986 clearRegion(); 987 } 988 989 TEST_F(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) { 990 renderengine::DisplaySettings settings; 991 settings.physicalDisplay = fullscreenRect(); 992 settings.clip = fullscreenRect(); 993 994 std::vector<renderengine::LayerSettings> layers; 995 996 renderengine::LayerSettings layer; 997 layer.geometry.boundaries = fullscreenRect().toFloatRect(); 998 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this); 999 1000 layers.push_back(layer); 1001 invokeDraw(settings, layers, mBuffer); 1002 uint64_t bufferId = layer.source.buffer.buffer->getId(); 1003 EXPECT_TRUE(sRE->isImageCachedForTesting(bufferId)); 1004 sRE->unbindExternalTextureBuffer(bufferId); 1005 EXPECT_FALSE(sRE->isImageCachedForTesting(bufferId)); 1006 } 1007 1008 TEST_F(RenderEngineTest, drawLayers_bindExternalBufferWithNullBuffer) { 1009 status_t result = sRE->bindExternalTextureBuffer(0, nullptr, nullptr); 1010 ASSERT_EQ(BAD_VALUE, result); 1011 } 1012 1013 TEST_F(RenderEngineTest, drawLayers_bindExternalBufferCachesImages) { 1014 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); 1015 uint32_t texName; 1016 sRE->genTextures(1, &texName); 1017 mTexNames.push_back(texName); 1018 1019 sRE->bindExternalTextureBuffer(texName, buf, nullptr); 1020 uint64_t bufferId = buf->getId(); 1021 EXPECT_TRUE(sRE->isImageCachedForTesting(bufferId)); 1022 sRE->unbindExternalTextureBuffer(bufferId); 1023 EXPECT_FALSE(sRE->isImageCachedForTesting(bufferId)); 1024 } 1025 1026 TEST_F(RenderEngineTest, drawLayers_cacheExternalBufferWithNullBuffer) { 1027 status_t result = sRE->cacheExternalTextureBuffer(nullptr); 1028 ASSERT_EQ(BAD_VALUE, result); 1029 } 1030 1031 TEST_F(RenderEngineTest, drawLayers_cacheExternalBufferCachesImages) { 1032 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1); 1033 uint64_t bufferId = buf->getId(); 1034 sRE->cacheExternalTextureBuffer(buf); 1035 EXPECT_TRUE(sRE->isImageCachedForTesting(bufferId)); 1036 sRE->unbindExternalTextureBuffer(bufferId); 1037 EXPECT_FALSE(sRE->isImageCachedForTesting(bufferId)); 1038 } 1039 1040 } // namespace android 1041