16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright (c) 2014 The Chromium Authors. All rights reserved.
26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file.
46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/tests/test_compositor.h"
66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <GLES2/gl2.h>
86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <GLES2/gl2ext.h>
96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <stdio.h>
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <stdlib.h>
116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <string.h>
126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/cpp/compositor.h"
156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/cpp/compositor_layer.h"
166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/cpp/image_data.h"
176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/lib/gl/gles2/gl2ext_ppapi.h"
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/lib/gl/include/GLES2/gl2.h"
196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/lib/gl/include/GLES2/gl2ext.h"
206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ppapi/tests/test_utils.h"
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace {
236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const float kMatrix[16] = {
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  1.0f, 0.0f, 0.0f, 0.0f,
266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  0.0f, 1.0f, 0.0f, 0.0f,
276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  0.0f, 0.0f, 1.0f, 0.0f,
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  0.0f, 0.0f, 0.0f, 1.0f,
296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)};
306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace
326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)REGISTER_TEST_CASE(Compositor);
346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#define VERIFY(r) do { \
366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    std::string result = (r); \
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    if (result != "") \
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      return result; \
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  } while (false)
406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool TestCompositor::Init() {
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!CheckTestingInterface())
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return false;
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!glInitializePPAPI(pp::Module::Get()->get_browser_interface()))
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return false;
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return true;
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void TestCompositor::RunTests(const std::string& filter) {
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, Release, filter);
536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, ReleaseWithoutCommit, filter);
546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, CommitTwoTimesWithoutChange, filter);
556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, General, filter);
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, ReleaseUnbound, filter);
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, ReleaseWithoutCommitUnbound, filter);
596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, CommitTwoTimesWithoutChangeUnbound, filter);
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, GeneralUnbound, filter);
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  RUN_CALLBACK_TEST(TestCompositor, BindUnbind, filter);
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestRelease() {
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestReleaseInternal(true);
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestReleaseWithoutCommit() {
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestReleaseWithoutCommitInternal(true);
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestCommitTwoTimesWithoutChange() {
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestCommitTwoTimesWithoutChangeInternal(true);
756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestGeneral() {
786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestGeneralInternal(true);
796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestReleaseUnbound() {
826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestReleaseInternal(false);
836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestReleaseWithoutCommitUnbound() {
866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestReleaseWithoutCommitInternal(false);
876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestCommitTwoTimesWithoutChangeUnbound() {
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestCommitTwoTimesWithoutChangeInternal(false);
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestGeneralUnbound() {
946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return TestGeneralInternal(false);
956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// TODO(penghuang): refactor common part in all tests to a member function.
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestBindUnbind() {
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Setup GLES2
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int32_t attribs[] = {
1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_WIDTH, 16,
1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_HEIGHT, 16,
1036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_NONE
1046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
1056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Graphics3D graphics_3d(instance_, attribs);
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(graphics_3d.is_null());
1076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(graphics_3d.pp_resource());
1086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Compositor compositor = pp::Compositor(instance_);
1106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(compositor.is_null());
1116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Add layers on an unbound compositor.
1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer color_layer = compositor.AddLayer();
1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(color_layer.is_null());
1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_OK));
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32_t texture = 0;
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateTexture(&texture));
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer texture_layer = compositor.AddLayer();
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(texture_layer.is_null());
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback texture_release_callback(instance_->pp_instance(),
1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  PP_REQUIRED);
1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            texture_layer.SetTexture(graphics_3d, GL_TEXTURE_2D, texture,
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     pp::Size(100, 100),
1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     texture_release_callback.GetCallback()));
1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::ImageData image;
1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateImage(&image));
1316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer image_layer = compositor.AddLayer();
1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback image_release_callback(instance_->pp_instance(),
1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                PP_REQUIRED);
1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            image_layer.SetImage(image, pp::Size(100, 100),
1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                 image_release_callback.GetCallback()));
1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Commit layers to the chromium compositor.
1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
1426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
1436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Bind the compositor and call CommitLayers() again.
1456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(instance_->BindGraphics(compositor));
1466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
1476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Unbind the compositor and call CommitLayers() again.
1516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_TRUE(instance_->BindGraphics(pp::Compositor()));
1526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
1536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
1546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
1556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Reset layers and call CommitLayers() again.
1576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, compositor.ResetLayers());
1586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
1606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  texture_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
1636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, texture_release_callback.result());
1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ReleaseTexture(texture);
1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  image_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, image_release_callback.result());
1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Reset
1706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(0);
1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestReleaseInternal(bool bind) {
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Setup GLES2
1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int32_t attribs[] = {
1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_WIDTH, 16,
1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_HEIGHT, 16,
1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_NONE
1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
1826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Graphics3D graphics_3d(instance_, attribs);
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(graphics_3d.is_null());
1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(graphics_3d.pp_resource());
1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Compositor compositor = pp::Compositor(instance_);
1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(compositor.is_null());
1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Bind the compositor to the instance
1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (bind)
1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(instance_->BindGraphics(compositor));
1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer color_layer = compositor.AddLayer();
1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(color_layer.is_null());
1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_OK));
1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32_t texture = 0;
1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateTexture(&texture));
2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer texture_layer = compositor.AddLayer();
2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(texture_layer.is_null());
2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback texture_release_callback(instance_->pp_instance(),
2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  PP_REQUIRED);
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            texture_layer.SetTexture(graphics_3d, GL_TEXTURE_2D, texture,
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     pp::Size(100, 100),
2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     texture_release_callback.GetCallback()));
2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::ImageData image;
2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateImage(&image));
2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer image_layer = compositor.AddLayer();
2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback image_release_callback(instance_->pp_instance(),
2136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                PP_REQUIRED);
2146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
2156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            image_layer.SetImage(image, pp::Size(100, 100),
2166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                 image_release_callback.GetCallback()));
2176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Commit layers to the chromium compositor.
2196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
2206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
2216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
2226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
2236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Release the compositor, and then release_callback will be aborted.
2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  compositor = pp::Compositor();
2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  texture_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
2286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_ERROR_ABORTED, texture_release_callback.result());
2296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ReleaseTexture(texture);
2306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  image_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
2326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_ERROR_ABORTED, image_release_callback.result());
2336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Reset
2356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(0);
2366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
2386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestReleaseWithoutCommitInternal(bool bind) {
2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Setup GLES2
2426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int32_t attribs[] = {
2436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_WIDTH, 16,
2446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_HEIGHT, 16,
2456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_NONE
2466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
2476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Graphics3D graphics_3d(instance_, attribs);
2486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(graphics_3d.is_null());
2496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(graphics_3d.pp_resource());
2506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Compositor compositor = pp::Compositor(instance_);
2526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(compositor.is_null());
2536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Bind the compositor to the instance
2556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (bind)
2566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(instance_->BindGraphics(compositor));
2576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer color_layer = compositor.AddLayer();
2596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(color_layer.is_null());
2606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_OK));
2626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32_t texture = 0;
2646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateTexture(&texture));
2656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer texture_layer = compositor.AddLayer();
2666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(texture_layer.is_null());
2676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback texture_release_callback(instance_->pp_instance(),
2686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  PP_REQUIRED);
2696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            texture_layer.SetTexture(graphics_3d, GL_TEXTURE_2D, texture,
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     pp::Size(100, 100),
2726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     texture_release_callback.GetCallback()));
2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::ImageData image;
2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateImage(&image));
2766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer image_layer = compositor.AddLayer();
2776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback image_release_callback(instance_->pp_instance(),
2786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                PP_REQUIRED);
2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
2806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            image_layer.SetImage(image, pp::Size(100, 100),
2816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                 image_release_callback.GetCallback()));
2826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Release the compositor, and then release_callback will be aborted.
2846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  compositor = pp::Compositor();
2856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // All release_callbacks should be called.
2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  texture_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
2886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_ERROR_ABORTED, texture_release_callback.result());
2896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ReleaseTexture(texture);
2906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  image_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
2926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_ERROR_ABORTED, image_release_callback.result());
2936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // The layer associated to the compositor will become invalidated.
2956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_ERROR_BADRESOURCE));
2966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Reset
2986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(0);
2996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
3016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestCommitTwoTimesWithoutChangeInternal(bool bind) {
3046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Compositor compositor(instance_);
3056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(compositor.is_null());
3066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (bind)
3076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(instance_->BindGraphics(compositor));
3086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer layer = compositor.AddLayer();
3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(layer.is_null());
3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(layer, PP_OK));
3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
3146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
3156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
3166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // CommitLayers() without any change.
3186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
3196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
3206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
3216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::TestGeneralInternal(bool bind) {
3266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Setup GLES2
3276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const int32_t attribs[] = {
3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_WIDTH, 16,
3296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_HEIGHT, 16,
3306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    PP_GRAPHICS3DATTRIB_NONE
3316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  };
3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Graphics3D graphics_3d(instance_, attribs);
3336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(graphics_3d.is_null());
3346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(graphics_3d.pp_resource());
3356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // All functions should work with a bound compositor
3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::Compositor compositor(instance_);
3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(compositor.is_null());
3396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (bind)
3406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(instance_->BindGraphics(compositor));
3416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer color_layer = compositor.AddLayer();
3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(color_layer.is_null());
3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_OK));
3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  uint32_t texture = 0;
3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateTexture(&texture));
3486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer texture_layer = compositor.AddLayer();
3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(texture_layer.is_null());
3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback texture_release_callback(instance_->pp_instance(),
3516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                  PP_REQUIRED);
3526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            texture_layer.SetTexture(graphics_3d, texture, GL_TEXTURE_2D,
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                     pp::Size(100, 100),
3556d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                     texture_release_callback.GetCallback()));
3566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::ImageData image;
3586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(CreateImage(&image));
3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  pp::CompositorLayer image_layer = compositor.AddLayer();
3606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback image_release_callback(instance_->pp_instance(),
3616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                                PP_REQUIRED);
3626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK_COMPLETIONPENDING,
3636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)            image_layer.SetImage(image, pp::Size(100, 100),
3646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                 image_release_callback.GetCallback()));
3656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
3676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
3686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
3696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
3706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // After ResetLayers(), all layers should be invalidated.
3726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, compositor.ResetLayers());
3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  VERIFY(SetColorLayer(color_layer, PP_ERROR_BADRESOURCE));
3746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Commit empty layer stack to the chromium compositor, and then the texture
3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // and the image will be released by the chromium compositor soon.
3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  callback.WaitForResult(compositor.CommitLayers(callback.GetCallback()));
3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  CHECK_CALLBACK_BEHAVIOR(callback);
3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, callback.result());
3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  texture_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, texture_release_callback.result());
3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ReleaseTexture(texture);
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  image_release_callback.WaitForResult(PP_OK_COMPLETIONPENDING);
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(PP_OK, image_release_callback.result());
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Reset
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glSetCurrentContextPPAPI(0);
3906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  PASS();
3926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::CreateTexture(uint32_t* texture) {
3956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glGenTextures(1, texture);
3966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_NE(0, *texture);
3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, *texture);
3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 400, 400, 0,
3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)               GL_RGBA, GL_UNSIGNED_BYTE, NULL);
4006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
4016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
4026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glBindTexture(GL_TEXTURE_2D, 0);
4056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return std::string();
4076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::ReleaseTexture(uint32_t texture) {
4106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_NE(0u, texture);
4116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  glDeleteTextures(1, &texture);
4126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return std::string();
4146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::CreateImage(pp::ImageData* image) {
4176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  *image = pp::ImageData(instance_, PP_IMAGEDATAFORMAT_RGBA_PREMUL,
4186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                         pp::Size(400, 400), false);
4196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_FALSE(image->is_null());
4206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return std::string();
4226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)std::string TestCompositor::SetColorLayer(
4256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    pp::CompositorLayer layer, int32_t result) {
4266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(result, layer.SetColor(255, 255, 255, 255, pp::Size(100, 100)));
4276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(result, layer.SetClipRect(pp::Rect(0, 0, 50, 50)));
4286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(result, layer.SetTransform(kMatrix));
4296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ASSERT_EQ(result, layer.SetOpacity(128));
4306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return std::string();
4326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
435