15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_graphics_3d.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2ext.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_opengles2.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/graphics_3d.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/lib/gl/gles2/gl2ext_ppapi.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/tests/test_case.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32_t kInvalidContext = 0;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(Graphics3D);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestGraphics3D::Init() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opengl_es2_ = static_cast<const PPB_OpenGLES2*>(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_OPENGLES2_INTERFACE));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glInitializePPAPI(pp::Module::Get()->get_browser_interface());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return opengl_es2_ && CheckTestingInterface();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestGraphics3D::RunTests(const std::string& filter) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RUN_CALLBACK_TEST(TestGraphics3D, FramePPAPI, filter);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RUN_CALLBACK_TEST(TestGraphics3D, FrameGL, filter);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RUN_CALLBACK_TEST(TestGraphics3D, ExtensionsGL, filter);
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RUN_CALLBACK_TEST(TestGraphics3D, BadResource, filter);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestGraphics3D::TestFramePPAPI() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int width = 16;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int height = 16;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32_t attribs[] = {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_WIDTH, width,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_HEIGHT, height,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_NONE
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Graphics3D context(instance_, attribs);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(context.is_null());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8_t red_color[4] = {255, 0, 0, 255};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Access OpenGLES API through the PPAPI interface.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear color buffer to opaque red.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opengl_es2_->ClearColor(context.pp_resource(), 1.0f, 0.0f, 0.0f, 1.0f);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opengl_es2_->Clear(context.pp_resource(), GL_COLOR_BUFFER_BIT);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the color buffer has opaque red.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error = CheckPixelPPAPI(&context, width/2, height/2, red_color);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!error.empty())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t rv = SwapBuffersSync(&context);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(rv, PP_OK);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestGraphics3D::TestFrameGL() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int width = 16;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int height = 16;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32_t attribs[] = {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_WIDTH, width,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_HEIGHT, height,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_NONE
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Graphics3D context(instance_, attribs);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(context.is_null());
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8_t red_color[4] = {255, 0, 0, 255};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform same operations as TestFramePPAPI, but use OpenGLES API directly.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is how most developers will use OpenGLES.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glSetCurrentContextPPAPI(context.pp_resource());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error = CheckPixelGL(width/2, height/2, red_color);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glSetCurrentContextPPAPI(kInvalidContext);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!error.empty())
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t rv = SwapBuffersSync(&context);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(rv, PP_OK);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestGraphics3D::TestExtensionsGL() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int width = 16;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int height = 16;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int32_t attribs[] = {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_WIDTH, width,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_HEIGHT, height,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_GRAPHICS3DATTRIB_NONE
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::Graphics3D context(instance_, attribs);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(context.is_null());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glSetCurrentContextPPAPI(context.pp_resource());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ask about a couple of extensions via glGetString.  If an extension is
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // available, try a couple of trivial calls.  This test is not intended
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be exhaustive; check the source can compile, link, and run without
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashing.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(glGetString(GL_VERSION), NULL);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* ext = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (strstr(ext, "GL_EXT_occlusion_query_boolean")) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint a_query;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLboolean is_a_query;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glGenQueriesEXT(1, &a_query);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(a_query, 0);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glBeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, a_query);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_a_query = glIsQueryEXT(a_query);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(is_a_query, GL_TRUE);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glEndQueryEXT(GL_ANY_SAMPLES_PASSED_EXT);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDeleteQueriesEXT(1, &a_query);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (strstr(ext, "GL_ANGLE_instanced_arrays")) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    glDrawArraysInstancedANGLE(GL_TRIANGLE_STRIP, 0, 0, 0);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glSetCurrentContextPPAPI(kInvalidContext);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t rv = SwapBuffersSync(&context);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(rv, PP_OK);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t TestGraphics3D::SwapBuffersSync(pp::Graphics3D* context) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestCompletionCallback callback(instance_->pp_instance(), callback_type());
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.WaitForResult(context->SwapBuffers(callback.GetCallback()));
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return callback.result();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestGraphics3D::CheckPixelPPAPI(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Graphics3D* context,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, const uint8_t expected_color[4]) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLubyte pixel_color[4];
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  opengl_es2_->ReadPixels(context->pp_resource(),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_color);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[0], expected_color[0]);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[1], expected_color[1]);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[2], expected_color[2]);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[3], expected_color[3]);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestGraphics3D::CheckPixelGL(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int x, int y, const uint8_t expected_color[4]) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLubyte pixel_color[4];
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_color);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[0], expected_color[0]);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[1], expected_color[1]);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[2], expected_color[2]);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(pixel_color[3], expected_color[3]);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::string TestGraphics3D::TestBadResource() {
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The point of this test is mostly just to make sure that we don't crash and
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // provide reasonable (error) results when the resource is bad.
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const PP_Resource kBadResource = 123;
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Access OpenGLES API through the PPAPI interface.
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  opengl_es2_->ClearColor(kBadResource, 0.0f, 0.0f, 0.0f, 0.0f);
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  opengl_es2_->Clear(kBadResource, GL_COLOR_BUFFER_BIT);
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(0, opengl_es2_->GetError(kBadResource));
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(NULL, opengl_es2_->GetString(kBadResource, GL_VERSION));
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(-1, opengl_es2_->GetUniformLocation(kBadResource, 0, NULL));
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(GL_FALSE, opengl_es2_->IsBuffer(kBadResource, 0));
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(0, opengl_es2_->CheckFramebufferStatus(kBadResource,
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                   GL_DRAW_FRAMEBUFFER));
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  glSetCurrentContextPPAPI(kBadResource);
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(0, glGetError());
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(NULL, glGetString(GL_VERSION));
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(-1, glGetUniformLocation(0, NULL));
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(GL_FALSE, glIsBuffer(0));
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(0, glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER));
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  glClear(GL_COLOR_BUFFER_BIT);
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PASS();
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
199