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