From 3ad781c1936d51071f321501a176c4a0b55b739c Mon Sep 17 00:00:00 2001 From: Benjamin Smedberg Date: Tue, 2 Aug 2011 15:35:42 -0400 Subject: [PATCH 01/15] Bug 666748 - Optionally support a pool of content processes instead of a single one. r=jdm The followup patch for 669640 must land together with this one. --- content/base/src/nsFrameLoader.cpp | 2 +- content/base/src/nsFrameMessageManager.cpp | 4 ++ dom/ipc/ContentParent.cpp | 59 ++++++++++++++++------ dom/ipc/ContentParent.h | 16 +++--- extensions/cookie/nsPermissionManager.cpp | 34 ++++--------- extensions/cookie/nsPermissionManager.h | 11 ---- modules/libpref/src/init/all.js | 2 + toolkit/components/places/History.cpp | 11 ++-- toolkit/xre/nsAppRunner.cpp | 7 +-- toolkit/xre/nsEmbedFunctions.cpp | 5 +- widget/src/android/nsWindow.cpp | 11 ++-- 11 files changed, 89 insertions(+), 73 deletions(-) diff --git a/content/base/src/nsFrameLoader.cpp b/content/base/src/nsFrameLoader.cpp index 2f4bd5a05443..89721ddd7e85 100644 --- a/content/base/src/nsFrameLoader.cpp +++ b/content/base/src/nsFrameLoader.cpp @@ -1791,7 +1791,7 @@ nsFrameLoader::TryRemoteBrowser() return false; } - ContentParent* parent = ContentParent::GetSingleton(); + ContentParent* parent = ContentParent::GetNewOrUsed(); NS_ASSERTION(parent->IsAlive(), "Process parent should be alive; something is very wrong!"); mRemoteBrowser = parent->CreateTab(chromeFlags); if (mRemoteBrowser) { diff --git a/content/base/src/nsFrameMessageManager.cpp b/content/base/src/nsFrameMessageManager.cpp index f906120b31a2..a572899bffbe 100644 --- a/content/base/src/nsFrameMessageManager.cpp +++ b/content/base/src/nsFrameMessageManager.cpp @@ -822,6 +822,7 @@ bool SendAsyncMessageToChildProcess(void* aCallbackData, const nsAString& aMessage, const nsAString& aJSON) { +#if 0 // Need code for multiple content processes mozilla::dom::ContentParent* cp = mozilla::dom::ContentParent::GetSingleton(PR_FALSE); NS_WARN_IF_FALSE(cp, "No child process!"); @@ -829,6 +830,9 @@ bool SendAsyncMessageToChildProcess(void* aCallbackData, return cp->SendAsyncMessage(nsString(aMessage), nsString(aJSON)); } return true; +#else + return false; +#endif } bool SendSyncMessageToParentProcess(void* aCallbackData, diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 86675d4caa30..3fb43c3b2162 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -44,6 +44,7 @@ #include "History.h" #include "mozilla/ipc/TestShellParent.h" #include "mozilla/net/NeckoParent.h" +#include "mozilla/Preferences.h" #include "nsHashPropertyBag.h" #include "nsIFilePicker.h" #include "nsIWindowWatcher.h" @@ -111,6 +112,7 @@ static NS_DEFINE_CID(kCClipboardCID, NS_CLIPBOARD_CID); static const char* sClipboardTextFlavors[] = { kUnicodeMime }; +using mozilla::Preferences; using namespace mozilla::ipc; using namespace mozilla::net; using namespace mozilla::places; @@ -154,21 +156,39 @@ MemoryReportRequestParent::~MemoryReportRequestParent() MOZ_COUNT_DTOR(MemoryReportRequestParent); } -ContentParent* ContentParent::gSingleton; +nsTArray* ContentParent::gContentParents; ContentParent* -ContentParent::GetSingleton(PRBool aForceNew) +ContentParent::GetNewOrUsed() { - if (gSingleton && !gSingleton->IsAlive()) - gSingleton = nsnull; - - if (!gSingleton && aForceNew) { - nsRefPtr parent = new ContentParent(); - gSingleton = parent; - parent->Init(); + if (!gContentParents) + gContentParents = new nsTArray(); + + PRInt32 maxContentProcesses = Preferences::GetInt("dom.ipc.processCount", 1); + if (maxContentProcesses < 1) + maxContentProcesses = 1; + + if (gContentParents->Length() >= PRUint32(maxContentProcesses)) { + ContentParent* p = (*gContentParents)[rand() % gContentParents->Length()]; + NS_ASSERTION(p->IsAlive(), "Non-alive contentparent in gContentParents?"); + return p; + } + + nsRefPtr p = new ContentParent(); + p->Init(); + gContentParents->AppendElement(p); + return p; +} + +void +ContentParent::GetAll(nsTArray& aArray) +{ + if (!gContentParents) { + aArray.Clear(); + return; } - return gSingleton; + aArray = *gContentParents; } void @@ -195,7 +215,7 @@ ContentParent::Init() threadInt->SetObserver(this); } if (obs) { - obs->NotifyObservers(nsnull, "ipc:content-created", nsnull); + obs->NotifyObservers(static_cast(this), "ipc:content-created", nsnull); } #ifdef ACCESSIBILITY @@ -295,6 +315,14 @@ ContentParent::ActorDestroy(ActorDestroyReason why) if (mRunToCompletionDepth) mRunToCompletionDepth = 0; + if (gContentParents) { + gContentParents->RemoveElement(this); + if (!gContentParents->Length()) { + delete gContentParents; + gContentParents = NULL; + } + } + mIsAlive = false; if (obs) { @@ -362,6 +390,7 @@ ContentParent::ContentParent() , mShouldCallUnblockChild(false) , mIsAlive(true) , mProcessStartTime(time(NULL)) + , mSendPermissionUpdates(false) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); mSubprocess = new GeckoChildProcessHost(GeckoProcessType_Content); @@ -380,10 +409,8 @@ ContentParent::~ContentParent() base::CloseProcessHandle(OtherProcess()); NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); - //If the previous content process has died, a new one could have - //been started since. - if (gSingleton == this) - gSingleton = nsnull; + NS_ASSERTION(!gContentParents || !gContentParents->Contains(this), + "Should have been removed in ActorDestroy"); } bool @@ -459,7 +486,7 @@ ContentParent::RecvReadPermissions(InfallibleTArray* aPermissio } // Ask for future changes - permissionManager->ChildRequestPermissions(); + mSendPermissionUpdates = true; #endif return true; diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index f7f9c4798a79..4c9717bb1d1d 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -77,12 +77,8 @@ private: typedef mozilla::ipc::TestShellParent TestShellParent; public: - static ContentParent* GetSingleton(PRBool aForceNew = PR_TRUE); - -#if 0 - // TODO: implement this somewhere! - static ContentParent* FreeSingleton(); -#endif + static ContentParent* GetNewOrUsed(); + static void GetAll(nsTArray& aArray); NS_DECL_ISUPPORTS NS_DECL_NSIOBSERVER @@ -102,12 +98,16 @@ public: void SetChildMemoryReporters(const InfallibleTArray& report); + bool NeedsPermissionsUpdate() { + return mSendPermissionUpdates; + } + protected: void OnChannelConnected(int32 pid); virtual void ActorDestroy(ActorDestroyReason why); private: - static ContentParent* gSingleton; + static nsTArray* gContentParents; // Hide the raw constructor methods since we don't want client code // using them. @@ -229,6 +229,8 @@ private: bool mIsAlive; nsCOMPtr mPrefService; time_t mProcessStartTime; + + bool mSendPermissionUpdates; }; } // namespace dom diff --git a/extensions/cookie/nsPermissionManager.cpp b/extensions/cookie/nsPermissionManager.cpp index f85221811170..486327dac96e 100644 --- a/extensions/cookie/nsPermissionManager.cpp +++ b/extensions/cookie/nsPermissionManager.cpp @@ -89,23 +89,6 @@ ChildProcess() } -/** - * @returns The parent process object, or if we are not in the parent - * process, nsnull. - */ -static ContentParent* -ParentProcess() -{ - if (!IsChildProcess()) { - ContentParent* cpc = ContentParent::GetSingleton(); - if (!cpc) - NS_RUNTIMEABORT("Content Process is NULL!"); - return cpc; - } - - return nsnull; -} - #define ENSURE_NOT_CHILD_PROCESS_(onError) \ PR_BEGIN_MACRO \ if (IsChildProcess()) { \ @@ -170,7 +153,6 @@ NS_IMPL_ISUPPORTS3(nsPermissionManager, nsIPermissionManager, nsIObserver, nsISu nsPermissionManager::nsPermissionManager() : mLargestID(0) - , mUpdateChildProcess(PR_FALSE) { } @@ -467,12 +449,16 @@ nsPermissionManager::AddInternal(const nsAFlatCString &aHost, DBOperationType aDBOperation) { if (!IsChildProcess()) { - // In the parent, send the update now, if the child is ready - if (mUpdateChildProcess) { - IPC::Permission permission((aHost), - (aType), - aPermission, aExpireType, aExpireTime); - unused << ParentProcess()->SendAddPermission(permission); + IPC::Permission permission((aHost), + (aType), + aPermission, aExpireType, aExpireTime); + + nsTArray cplist; + ContentParent::GetAll(cplist); + for (PRUint32 i = 0; i < cplist.Length(); ++i) { + ContentParent* cp = cplist[i]; + if (cp->NeedsPermissionsUpdate()) + unused << cp->SendAddPermission(permission); } } diff --git a/extensions/cookie/nsPermissionManager.h b/extensions/cookie/nsPermissionManager.h index 78786a32943f..79f9b3f0bbb3 100644 --- a/extensions/cookie/nsPermissionManager.h +++ b/extensions/cookie/nsPermissionManager.h @@ -250,17 +250,6 @@ private: // An array to store the strings identifying the different types. nsTArray mTypeArray; - - // Whether we should update the child process with every change to a - // permission. This is set to true once the child is ready to receive - // such updates. - PRBool mUpdateChildProcess; - -public: - void ChildRequestPermissions() - { - mUpdateChildProcess = PR_TRUE; - } }; // {4F6B5E00-0C36-11d5-A535-0010A401EB10} diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 8339b99ad395..a8a1574faf5a 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -1493,6 +1493,8 @@ pref("dom.ipc.plugins.enabled.602plugin.so", false); #endif #endif +pref("dom.ipc.processCount", 1); + pref("svg.smil.enabled", true); pref("font.minimum-size.ar", 0); diff --git a/toolkit/components/places/History.cpp b/toolkit/components/places/History.cpp index 126d1f9dc456..9bc8b6114bad 100644 --- a/toolkit/components/places/History.cpp +++ b/toolkit/components/places/History.cpp @@ -55,6 +55,7 @@ #include "nsThreadUtils.h" #include "nsNetUtil.h" #include "nsIXPConnect.h" +#include "mozilla/unused.h" #include "mozilla/Util.h" #include "nsContentUtils.h" @@ -65,6 +66,7 @@ #define TOPIC_UPDATEPLACES_COMPLETE "places-updatePlaces-complete" using namespace mozilla::dom; +using mozilla::unused; namespace mozilla { namespace places { @@ -1282,10 +1284,11 @@ History::NotifyVisited(nsIURI* aURI) nsAutoScriptBlocker scriptBlocker; if (XRE_GetProcessType() == GeckoProcessType_Default) { - mozilla::dom::ContentParent* cpp = - mozilla::dom::ContentParent::GetSingleton(PR_FALSE); - if (cpp) - (void)cpp->SendNotifyVisited(aURI); + nsTArray cplist; + ContentParent::GetAll(cplist); + for (PRUint32 i = 0; i < cplist.Length(); ++i) { + unused << cplist[i]->SendNotifyVisited(aURI); + } } // If the hash table has not been initialized, then we have nothing to notify diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index 4a7f9306949d..830092184038 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -121,6 +121,9 @@ #include "nsAppShellCID.h" #include "mozilla/FunctionTimer.h" +#include "mozilla/unused.h" + +using mozilla::unused; #ifdef XP_WIN #include "nsIWinAppHelper.h" @@ -755,9 +758,7 @@ nsXULAppInfo::EnsureContentProcess() if (XRE_GetProcessType() != GeckoProcessType_Default) return NS_ERROR_NOT_AVAILABLE; - ContentParent* c = ContentParent::GetSingleton(); - if (!c) - return NS_ERROR_NOT_AVAILABLE; + unused << ContentParent::GetNewOrUsed(); return NS_OK; } diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp index 912e0c99663b..47ef88750761 100644 --- a/toolkit/xre/nsEmbedFunctions.cpp +++ b/toolkit/xre/nsEmbedFunctions.cpp @@ -712,7 +712,7 @@ TestShellParent* gTestShellParent = nsnull; TestShellParent* GetOrCreateTestShellParent() { if (!gTestShellParent) { - ContentParent* parent = ContentParent::GetSingleton(); + ContentParent* parent = ContentParent::GetNewOrUsed(); NS_ENSURE_TRUE(parent, nsnull); gTestShellParent = parent->CreateTestShell(); NS_ENSURE_TRUE(gTestShellParent, nsnull); @@ -758,7 +758,8 @@ XRE_ShutdownTestShell() { if (!gTestShellParent) return true; - return ContentParent::GetSingleton()->DestroyTestShell(gTestShellParent); + return static_cast(gTestShellParent->Manager())-> + DestroyTestShell(gTestShellParent); } #ifdef MOZ_X11 diff --git a/widget/src/android/nsWindow.cpp b/widget/src/android/nsWindow.cpp index 73fe9f66be21..635b65302559 100644 --- a/widget/src/android/nsWindow.cpp +++ b/widget/src/android/nsWindow.cpp @@ -95,8 +95,8 @@ class ContentCreationNotifier : public nsIObserver const PRUnichar* aData) { if (!strcmp(aTopic, "ipc:content-created")) { - ContentParent *cp = ContentParent::GetSingleton(PR_FALSE); - NS_ABORT_IF_FALSE(cp, "Must have content process if notified of its creation"); + nsCOMPtr cpo = do_QueryInterface(aSubject); + ContentParent* cp = static_cast(cpo.get()); unused << cp->SendScreenSizeChanged(gAndroidScreenBounds); } else if (!strcmp(aTopic, "xpcom-shutdown")) { nsCOMPtr @@ -771,9 +771,10 @@ nsWindow::OnGlobalAndroidEvent(AndroidGeckoEvent *ae) break; // Tell the content process the new screen size. - ContentParent *cp = ContentParent::GetSingleton(PR_FALSE); - if (cp) - unused << cp->SendScreenSizeChanged(gAndroidScreenBounds); + nsTArray cplist; + ContentParent::GetAll(cplist); + for (PRUint32 i = 0; i < cplist.Length(); ++i) + unused << cplist[i]->SendScreenSizeChanged(gAndroidScreenBounds); if (gContentCreationNotifier) break; From a34096329892e1e69f419bdd58d921f46492df5c Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Thu, 18 Aug 2011 08:58:49 -0400 Subject: [PATCH 02/15] Update NSPR to the NSPR_4_9_BETA1 tag. Fixes bug 676457, bug 653737, bug 673799, bug 673817, bug 678993, bug 676584 --- nsprpub/TAG-INFO | 2 +- nsprpub/admin/repackage.sh | 8 +- nsprpub/configure | 303 ++- nsprpub/configure.in | 63 +- nsprpub/lib/ds/plarena.c | 10 +- nsprpub/lib/ds/plarenas.h | 7 +- nsprpub/lib/msgc/.cvsignore | 1 - nsprpub/lib/msgc/Makefile.in | 52 - nsprpub/lib/msgc/include/.cvsignore | 1 - nsprpub/lib/msgc/include/Makefile.in | 57 - nsprpub/lib/msgc/include/gcint.h | 129 - nsprpub/lib/msgc/include/prgc.h | 419 ---- nsprpub/lib/msgc/src/.cvsignore | 1 - nsprpub/lib/msgc/src/Makefile.in | 93 - nsprpub/lib/msgc/src/os2gc.c | 83 - nsprpub/lib/msgc/src/prgcapi.c | 330 --- nsprpub/lib/msgc/src/prmsgc.c | 3320 -------------------------- nsprpub/lib/msgc/src/unixgc.c | 155 -- nsprpub/lib/msgc/src/win32gc.c | 129 - nsprpub/lib/msgc/tests/.cvsignore | 1 - nsprpub/lib/msgc/tests/Makefile.in | 270 --- nsprpub/lib/msgc/tests/gc1.c | 242 -- nsprpub/lib/msgc/tests/thrashgc.c | 242 -- nsprpub/pr/include/md/_darwin.h | 7 +- nsprpub/pr/include/prinit.h | 8 +- nsprpub/pr/include/prtypes.h | 17 + nsprpub/pr/src/md/unix/uxproces.c | 9 + nsprpub/pr/tests/vercheck.c | 12 +- 28 files changed, 303 insertions(+), 5668 deletions(-) delete mode 100644 nsprpub/lib/msgc/.cvsignore delete mode 100644 nsprpub/lib/msgc/Makefile.in delete mode 100644 nsprpub/lib/msgc/include/.cvsignore delete mode 100644 nsprpub/lib/msgc/include/Makefile.in delete mode 100644 nsprpub/lib/msgc/include/gcint.h delete mode 100644 nsprpub/lib/msgc/include/prgc.h delete mode 100644 nsprpub/lib/msgc/src/.cvsignore delete mode 100644 nsprpub/lib/msgc/src/Makefile.in delete mode 100644 nsprpub/lib/msgc/src/os2gc.c delete mode 100644 nsprpub/lib/msgc/src/prgcapi.c delete mode 100644 nsprpub/lib/msgc/src/prmsgc.c delete mode 100644 nsprpub/lib/msgc/src/unixgc.c delete mode 100644 nsprpub/lib/msgc/src/win32gc.c delete mode 100644 nsprpub/lib/msgc/tests/.cvsignore delete mode 100644 nsprpub/lib/msgc/tests/Makefile.in delete mode 100644 nsprpub/lib/msgc/tests/gc1.c delete mode 100644 nsprpub/lib/msgc/tests/thrashgc.c diff --git a/nsprpub/TAG-INFO b/nsprpub/TAG-INFO index b2eb7c24e836..39891545682d 100644 --- a/nsprpub/TAG-INFO +++ b/nsprpub/TAG-INFO @@ -1 +1 @@ -NSPR_4_8_9_RTM +NSPR_4_9_BETA1 diff --git a/nsprpub/admin/repackage.sh b/nsprpub/admin/repackage.sh index 8ed1a5df8e18..f48298243754 100755 --- a/nsprpub/admin/repackage.sh +++ b/nsprpub/admin/repackage.sh @@ -64,10 +64,10 @@ # # ------------------------------------------------------------------ -FROMTOP=/share/builds/components/nspr20/v4.8.9 -TOTOP=./v4.8.9 -NSPRDIR=nspr-4.8.9 -SOURCETAG=NSPR_4_8_9_RTM +FROMTOP=/share/builds/components/nspr20/v4.9 +TOTOP=./v4.9 +NSPRDIR=nspr-4.9 +SOURCETAG=NSPR_4_9_RTM # # enumerate Unix object directories on /s/b/c diff --git a/nsprpub/configure b/nsprpub/configure index dc2de9b0a772..246114bccaf5 100755 --- a/nsprpub/configure +++ b/nsprpub/configure @@ -730,8 +730,8 @@ test "$host_alias" != "$target_alias" && MOD_MAJOR_VERSION=4 -MOD_MINOR_VERSION=8 -MOD_PATCH_VERSION=9 +MOD_MINOR_VERSION=9 +MOD_PATCH_VERSION=0 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= @@ -878,11 +878,41 @@ case "$target" in fi if test -z "$android_toolchain" ; then - android_toolchain="$android_ndk"/build/prebuilt/`uname -s | tr "[:upper:]" "[:lower:]"`-x86/arm-eabi-4.4.0 + echo $ac_n "checking for android toolchain directory""... $ac_c" 1>&6 +echo "configure:883: checking for android toolchain directory" >&5 + + kernel_name=`uname -s | tr "[:upper:]" "[:lower:]"` + + android_toolchain="$android_ndk"/build/prebuilt/$kernel_name-x86/arm-eabi-4.4.0 + + # With newer NDK, the toolchain path has changed. + if ! test -d "$android_toolchain" ; then + android_toolchain="$android_ndk"/toolchains/arm-$kernel_name-androideabi-4.4.3/prebuilt/$kernel_name-x86 + fi + + if test -d "$android_toolchain" ; then + echo "$ac_t""$android_toolchain" 1>&6 + else + { echo "configure: error: not found. You have to specify --with-android-toolchain=/path/to/ndk/toolchain." 1>&2; exit 1; } + fi fi if test -z "$android_platform" ; then - android_platform="$android_ndk"/build/platforms/android-5/arch-arm + echo $ac_n "checking for android platform directory""... $ac_c" 1>&6 +echo "configure:903: checking for android platform directory" >&5 + + android_platform="$android_ndk"/build/platforms/android-5/arch-arm + + # With newer NDK, the platform path has changed. + if ! test -d "$android_platform" ; then + android_platform="$android_ndk"/platforms/android-5/arch-arm + fi + + if test -d "$android_platform" ; then + echo "$ac_t""$android_platform" 1>&6 + else + { echo "configure: error: not found. You have to specify --with-android-platform=/path/to/ndk/platform." 1>&2; exit 1; } + fi fi AS="$android_toolchain"/bin/"$android_tool_prefix"-as @@ -1213,7 +1243,7 @@ if test -z "$SKIP_PATH_CHECKS"; then # Extract the first word of "$WHOAMI whoami", so it can be a program name with args. set dummy $WHOAMI whoami; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1217: checking for $ac_word" >&5 +echo "configure:1247: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_WHOAMI'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1275,7 +1305,8 @@ EOF fi if test -z "$SKIP_COMPILER_CHECKS"; then -if test "$target" != "$host"; then + +if test "$target" != "$host" -o -n "$CROSS_COMPILE"; then echo "cross compiling from $host to $target" cross_compiling=yes @@ -1284,13 +1315,13 @@ if test "$target" != "$host"; then _SAVE_LDFLAGS="$LDFLAGS" echo $ac_n "checking for $host compiler""... $ac_c" 1>&6 -echo "configure:1288: checking for $host compiler" >&5 +echo "configure:1319: checking for $host compiler" >&5 for ac_prog in $HOST_CC gcc cc /usr/ucb/cc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1294: checking for $ac_word" >&5 +echo "configure:1325: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_HOST_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1336,16 +1367,16 @@ test -n "$HOST_CC" || HOST_CC="""" LDFLAGS="$HOST_LDFLAGS" echo $ac_n "checking whether the $host compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1340: checking whether the $host compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works" >&5 +echo "configure:1371: checking whether the $host compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1380: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_prog_host_cc_works=1 echo "$ac_t""yes" 1>&6 else @@ -1363,18 +1394,24 @@ rm -f conftest* case "$build:$target" in powerpc-apple-darwin8*:i?86-apple-darwin*) _SAVE_CFLAGS=$CFLAGS - _SAVE_CXXFLAGS=$CXXLAGS + _SAVE_CXXFLAGS=$CXXFLAGS CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CFLAGS" CXXFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CXXFLAGS" - ;; - esac + ;; + *:arm*-apple-darwin*) + _SAVE_CFLAGS=$CFLAGS + _SAVE_CXXFLAGS=$CXXFLAGS + CFLAGS="-isysroot $MACOS_SDK_DIR $CFLAGS" + CXXFLAGS="-isysroot $MACOS_SDK_DIR $CXXFLAGS" + ;; + esac for ac_prog in $CC "${target_alias}-gcc" "${target}-gcc" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1378: checking for $ac_word" >&5 +echo "configure:1415: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1408,7 +1445,7 @@ test -n "$CC" || CC="echo" # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1412: checking for $ac_word" >&5 +echo "configure:1449: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1438,7 +1475,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1442: checking for $ac_word" >&5 +echo "configure:1479: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1489,7 +1526,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1493: checking for $ac_word" >&5 +echo "configure:1530: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1521,7 +1558,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1525: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1562: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1532,12 +1569,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 1536 "configure" +#line 1573 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:1541: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1563,12 +1600,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1567: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1604: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1572: checking whether we are using GNU C" >&5 +echo "configure:1609: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1577,7 +1614,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1581: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1596,7 +1633,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1600: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:1637: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1633,7 +1670,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1637: checking for $ac_word" >&5 +echo "configure:1674: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1669,7 +1706,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1673: checking for $ac_word" >&5 +echo "configure:1710: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1701,7 +1738,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1705: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:1742: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1712,12 +1749,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 1716 "configure" +#line 1753 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:1721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1758: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1743,12 +1780,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1747: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1784: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:1752: checking whether we are using GNU C++" >&5 +echo "configure:1789: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1757,7 +1794,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1761: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1798: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -1776,7 +1813,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:1780: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:1817: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1810,7 +1847,7 @@ fi fi case "$build:$target" in - powerpc-apple-darwin8*:i?86-apple-darwin*) + powerpc-apple-darwin8*:i?86-apple-darwin*|*:arm*-apple-darwin*) CFLAGS=$_SAVE_CFLAGS CXXFLAGS=$_SAVE_CXXFLAGS ;; @@ -1821,7 +1858,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1825: checking for $ac_word" >&5 +echo "configure:1862: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1856,7 +1893,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1860: checking for $ac_word" >&5 +echo "configure:1897: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1891,7 +1928,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1895: checking for $ac_word" >&5 +echo "configure:1932: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1926,7 +1963,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1930: checking for $ac_word" >&5 +echo "configure:1967: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1961,7 +1998,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1965: checking for $ac_word" >&5 +echo "configure:2002: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1996,7 +2033,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2000: checking for $ac_word" >&5 +echo "configure:2037: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2031,7 +2068,7 @@ else # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2035: checking for $ac_word" >&5 +echo "configure:2072: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2061,7 +2098,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2065: checking for $ac_word" >&5 +echo "configure:2102: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2112,7 +2149,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2116: checking for $ac_word" >&5 +echo "configure:2153: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2144,7 +2181,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:2148: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:2185: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -2155,12 +2192,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 2159 "configure" +#line 2196 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:2164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2201: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -2186,12 +2223,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:2190: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:2227: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:2195: checking whether we are using GNU C" >&5 +echo "configure:2232: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2200,7 +2237,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2204: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2241: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -2219,7 +2256,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:2223: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:2260: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2259,7 +2296,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2263: checking for $ac_word" >&5 +echo "configure:2300: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2291,7 +2328,7 @@ test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:2295: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 +echo "configure:2332: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -2302,12 +2339,12 @@ cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF -#line 2306 "configure" +#line 2343 "configure" #include "confdefs.h" int main(){return(0);} EOF -if { (eval echo configure:2311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2348: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -2333,12 +2370,12 @@ if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:2337: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:2374: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:2342: checking whether we are using GNU C++" >&5 +echo "configure:2379: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2347,7 +2384,7 @@ else yes; #endif EOF -if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:2351: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:2388: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no @@ -2366,7 +2403,7 @@ ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:2370: checking whether ${CXX-g++} accepts -g" >&5 +echo "configure:2407: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2400,7 +2437,7 @@ fi fi fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2404: checking how to run the C preprocessor" >&5 +echo "configure:2441: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2415,13 +2452,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2425: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2432,13 +2469,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2442: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2449,13 +2486,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2459: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2496: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2482,7 +2519,7 @@ echo "$ac_t""$CPP" 1>&6 # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2486: checking for $ac_word" >&5 +echo "configure:2523: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2514,7 +2551,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2518: checking for $ac_word" >&5 +echo "configure:2555: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_AS'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2555,7 +2592,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2559: checking for $ac_word" >&5 +echo "configure:2596: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2596,7 +2633,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2600: checking for $ac_word" >&5 +echo "configure:2637: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2637,7 +2674,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2641: checking for $ac_word" >&5 +echo "configure:2678: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_STRIP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2678,7 +2715,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2682: checking for $ac_word" >&5 +echo "configure:2719: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_WINDRES'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2746,7 +2783,7 @@ else fi echo $ac_n "checking for gcc -pipe support""... $ac_c" 1>&6 -echo "configure:2750: checking for gcc -pipe support" >&5 +echo "configure:2787: checking for gcc -pipe support" >&5 if test -n "$GNU_CC" && test -n "$GNU_CXX" && test -n "$GNU_AS"; then echo '#include ' > dummy-hello.c echo 'int main() { printf("Hello World\n"); return 0; }' >> dummy-hello.c @@ -2761,14 +2798,14 @@ if test -n "$GNU_CC" && test -n "$GNU_CXX" && test -n "$GNU_AS"; then _SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -pipe" cat > conftest.$ac_ext < int main() { printf("Hello World\n"); ; return 0; } EOF -if { (eval echo configure:2772: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2809: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* _res_gcc_pipe="yes" else @@ -2798,16 +2835,16 @@ _SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fprofile-generate -fprofile-correction" echo $ac_n "checking whether C compiler supports -fprofile-generate""... $ac_c" 1>&6 -echo "configure:2802: checking whether C compiler supports -fprofile-generate" >&5 +echo "configure:2839: checking whether C compiler supports -fprofile-generate" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2848: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* PROFILE_GEN_CFLAGS="-fprofile-generate" result="yes" @@ -2830,7 +2867,7 @@ CFLAGS="$_SAVE_CFLAGS" if test "$GNU_CC"; then echo $ac_n "checking for visibility(hidden) attribute""... $ac_c" 1>&6 -echo "configure:2834: checking for visibility(hidden) attribute" >&5 +echo "configure:2871: checking for visibility(hidden) attribute" >&5 if eval "test \"`echo '$''{'ac_cv_visibility_hidden'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2854,7 +2891,7 @@ echo "$ac_t""$ac_cv_visibility_hidden" 1>&6 EOF echo $ac_n "checking for visibility pragma support""... $ac_c" 1>&6 -echo "configure:2858: checking for visibility pragma support" >&5 +echo "configure:2895: checking for visibility pragma support" >&5 if eval "test \"`echo '$''{'ac_cv_visibility_pragma'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2907,7 +2944,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2911: checking for $ac_word" >&5 +echo "configure:2948: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3228,14 +3265,14 @@ no) _SAVE_CFLAGS="$CFLAGS" CFLAGS="$arch_flag" cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* MOZ_THUMB2=1 else @@ -3297,16 +3334,16 @@ if test -n "$all_flags"; then _SAVE_CFLAGS="$CFLAGS" CFLAGS="$all_flags" echo $ac_n "checking whether the chosen combination of compiler flags ($all_flags) works""... $ac_c" 1>&6 -echo "configure:3301: checking whether the chosen combination of compiler flags ($all_flags) works" >&5 +echo "configure:3338: checking whether the chosen combination of compiler flags ($all_flags) works" >&5 cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3347: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* echo "$ac_t""yes" 1>&6 else @@ -3363,17 +3400,17 @@ EOF DSO_LDOPTS='-brtl -bnortllib -bM:SRE -bnoentry -bexpall -blibpath:/usr/lib:/lib' ac_safe=`echo "sys/atomic_op.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for sys/atomic_op.h""... $ac_c" 1>&6 -echo "configure:3367: checking for sys/atomic_op.h" >&5 +echo "configure:3404: checking for sys/atomic_op.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3414: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -3569,7 +3606,7 @@ EOF _DEBUG_FLAGS='-gdwarf-2 -O0' MKSHLIB='$(CCC) $(DSO_LDOPTS) -o $@' echo $ac_n "checking for gethostbyaddr in -lbind""... $ac_c" 1>&6 -echo "configure:3573: checking for gethostbyaddr in -lbind" >&5 +echo "configure:3610: checking for gethostbyaddr in -lbind" >&5 ac_lib_var=`echo bind'_'gethostbyaddr | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3577,7 +3614,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lbind $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:3629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3775,6 +3812,9 @@ EOF AS='$(CC) -x assembler-with-cpp' CFLAGS="$CFLAGS -Wall -fno-common" case "${target_cpu}" in + arm*) + CPU_ARCH=arm + ;; i*86*) if test -n "$USE_64"; then CPU_ARCH=x86_64 @@ -3789,6 +3829,39 @@ EOF if test "`echo $CC | grep -c '\-arch '`" = "0"; then CC="$CC -arch $CPU_ARCH" fi + ac_safe=`echo "crt_externs.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for crt_externs.h""... $ac_c" 1>&6 +echo "configure:3835: checking for crt_externs.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:3845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +fi + DSO_CFLAGS=-fPIC DSO_LDOPTS='-dynamiclib -compatibility_version 1 -current_version 1 -all_load -install_name @executable_path/$@ -headerpad_max_install_names' _OPTIMIZE_FLAGS=-O2 @@ -4942,17 +5015,17 @@ EOF _OPTIMIZE_FLAGS="$_OPTIMIZE_FLAGS -Olimit 4000" ac_safe=`echo "machine/builtins.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for machine/builtins.h""... $ac_c" 1>&6 -echo "configure:4946: checking for machine/builtins.h" >&5 +echo "configure:5019: checking for machine/builtins.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5029: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5601,7 +5674,7 @@ case $target in ;; *) echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:5605: checking for dlopen in -ldl" >&5 +echo "configure:5678: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -5609,7 +5682,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -5637,17 +5710,17 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6 -echo "configure:5641: checking for dlfcn.h" >&5 +echo "configure:5714: checking for dlfcn.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:5651: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:5724: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -5680,13 +5753,13 @@ esac if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 -echo "configure:5684: checking whether ${CC-cc} needs -traditional" >&5 +echo "configure:5757: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP @@ -5704,7 +5777,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA @@ -5728,12 +5801,12 @@ fi for ac_func in lchown strerror do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:5732: checking for $ac_func" >&5 +echo "configure:5805: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:5833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -5807,7 +5880,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:5811: checking for $ac_word" >&5 +echo "configure:5884: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_CCACHE'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5866,7 +5939,7 @@ hpux*) if test -z "$GNU_CC"; then echo $ac_n "checking for +Olit support""... $ac_c" 1>&6 -echo "configure:5870: checking for +Olit support" >&5 +echo "configure:5943: checking for +Olit support" >&5 if eval "test \"`echo '$''{'ac_cv_hpux_usable_olit_option'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -5908,7 +5981,7 @@ wince*) *) echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6 -echo "configure:5912: checking for pthread_create in -lpthreads" >&5 +echo "configure:5985: checking for pthread_create in -lpthreads" >&5 echo " #include void *foo(void *v) { return v; } @@ -5930,7 +6003,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6 -echo "configure:5934: checking for pthread_create in -lpthread" >&5 +echo "configure:6007: checking for pthread_create in -lpthread" >&5 echo " #include void *foo(void *v) { return v; } @@ -5952,7 +6025,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lc_r""... $ac_c" 1>&6 -echo "configure:5956: checking for pthread_create in -lc_r" >&5 +echo "configure:6029: checking for pthread_create in -lc_r" >&5 echo " #include void *foo(void *v) { return v; } @@ -5974,7 +6047,7 @@ echo " echo "$ac_t""no" 1>&6 echo $ac_n "checking for pthread_create in -lc""... $ac_c" 1>&6 -echo "configure:5978: checking for pthread_create in -lc" >&5 +echo "configure:6051: checking for pthread_create in -lc" >&5 echo " #include void *foo(void *v) { return v; } @@ -6092,7 +6165,7 @@ if test -n "$USE_PTHREADS"; then rm -f conftest* ac_cv_have_dash_pthread=no echo $ac_n "checking whether ${CC-cc} accepts -pthread""... $ac_c" 1>&6 -echo "configure:6096: checking whether ${CC-cc} accepts -pthread" >&5 +echo "configure:6169: checking whether ${CC-cc} accepts -pthread" >&5 echo 'int main() { return 0; }' | cat > conftest.c ${CC-cc} -pthread -o conftest conftest.c > conftest.out 2>&1 if test $? -eq 0; then @@ -6115,7 +6188,7 @@ echo "configure:6096: checking whether ${CC-cc} accepts -pthread" >&5 ac_cv_have_dash_pthreads=no if test "$ac_cv_have_dash_pthread" = "no"; then echo $ac_n "checking whether ${CC-cc} accepts -pthreads""... $ac_c" 1>&6 -echo "configure:6119: checking whether ${CC-cc} accepts -pthreads" >&5 +echo "configure:6192: checking whether ${CC-cc} accepts -pthreads" >&5 echo 'int main() { return 0; }' | cat > conftest.c ${CC-cc} -pthreads -o conftest conftest.c > conftest.out 2>&1 if test $? -eq 0; then diff --git a/nsprpub/configure.in b/nsprpub/configure.in index 39c96a3086b1..fe556b89c302 100644 --- a/nsprpub/configure.in +++ b/nsprpub/configure.in @@ -49,8 +49,8 @@ dnl ======================================================== dnl = Defaults dnl ======================================================== MOD_MAJOR_VERSION=4 -MOD_MINOR_VERSION=8 -MOD_PATCH_VERSION=9 +MOD_MINOR_VERSION=9 +MOD_PATCH_VERSION=0 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= @@ -170,11 +170,39 @@ case "$target" in fi if test -z "$android_toolchain" ; then - android_toolchain="$android_ndk"/build/prebuilt/`uname -s | tr "[[:upper:]]" "[[:lower:]]"`-x86/arm-eabi-4.4.0 + AC_MSG_CHECKING([for android toolchain directory]) + + kernel_name=`uname -s | tr "[[:upper:]]" "[[:lower:]]"` + + android_toolchain="$android_ndk"/build/prebuilt/$kernel_name-x86/arm-eabi-4.4.0 + + # With newer NDK, the toolchain path has changed. + if ! test -d "$android_toolchain" ; then + android_toolchain="$android_ndk"/toolchains/arm-$kernel_name-androideabi-4.4.3/prebuilt/$kernel_name-x86 + fi + + if test -d "$android_toolchain" ; then + AC_MSG_RESULT([$android_toolchain]) + else + AC_MSG_ERROR([not found. You have to specify --with-android-toolchain=/path/to/ndk/toolchain.]) + fi fi if test -z "$android_platform" ; then - android_platform="$android_ndk"/build/platforms/android-5/arch-arm + AC_MSG_CHECKING([for android platform directory]) + + android_platform="$android_ndk"/build/platforms/android-5/arch-arm + + # With newer NDK, the platform path has changed. + if ! test -d "$android_platform" ; then + android_platform="$android_ndk"/platforms/android-5/arch-arm + fi + + if test -d "$android_platform" ; then + AC_MSG_RESULT([$android_platform]) + else + AC_MSG_ERROR([not found. You have to specify --with-android-platform=/path/to/ndk/platform.]) + fi fi dnl set up compilers @@ -499,7 +527,11 @@ if test -z "$SKIP_COMPILER_CHECKS"; then dnl ======================================================== dnl Checks for compilers. dnl ======================================================== -if test "$target" != "$host"; then + +dnl Explicitly honor $CROSS_COMPILE to allow cross-compiling +dnl between toolkits on the same architecture, as when +dnl targeting the iOS Simulator from OS X. +if test "$target" != "$host" -o -n "$CROSS_COMPILE"; then echo "cross compiling from $host to $target" cross_compiling=yes @@ -541,11 +573,20 @@ if test "$target" != "$host"; then dnl versions of PPC OS X 10.4 aren't fat, so these target compiler dnl checks will fail. Fake a working SDK in that case. _SAVE_CFLAGS=$CFLAGS - _SAVE_CXXFLAGS=$CXXLAGS + _SAVE_CXXFLAGS=$CXXFLAGS CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CFLAGS" CXXFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CXXFLAGS" - ;; - esac + ;; + *:arm*-apple-darwin*) + dnl The arm compiler doesn't appear to know about its root by default, + dnl so explicitly pass it one here. Later on we'll put this in CFLAGS + dnl anyway. + _SAVE_CFLAGS=$CFLAGS + _SAVE_CXXFLAGS=$CXXFLAGS + CFLAGS="-isysroot $MACOS_SDK_DIR $CFLAGS" + CXXFLAGS="-isysroot $MACOS_SDK_DIR $CXXFLAGS" + ;; + esac AC_CHECK_PROGS(CC, $CC "${target_alias}-gcc" "${target}-gcc", echo) unset ac_cv_prog_CC @@ -557,7 +598,7 @@ if test "$target" != "$host"; then fi case "$build:$target" in - powerpc-apple-darwin8*:i?86-apple-darwin*) + powerpc-apple-darwin8*:i?86-apple-darwin*|*:arm*-apple-darwin*) dnl Revert the changes made above. From this point on, the target dnl compiler will never be used without applying the SDK to CFLAGS dnl (see --with-macos-sdk below). @@ -1306,6 +1347,9 @@ case "$target" in AS='$(CC) -x assembler-with-cpp' CFLAGS="$CFLAGS -Wall -fno-common" case "${target_cpu}" in + arm*) + CPU_ARCH=arm + ;; i*86*) if test -n "$USE_64"; then CPU_ARCH=x86_64 @@ -1320,6 +1364,7 @@ case "$target" in if test "`echo $CC | grep -c '\-arch '`" = "0"; then CC="$CC -arch $CPU_ARCH" fi + AC_CHECK_HEADER(crt_externs.h) DSO_CFLAGS=-fPIC DSO_LDOPTS='-dynamiclib -compatibility_version 1 -current_version 1 -all_load -install_name @executable_path/$@ -headerpad_max_install_names' _OPTIMIZE_FLAGS=-O2 diff --git a/nsprpub/lib/ds/plarena.c b/nsprpub/lib/ds/plarena.c index 22dae78797af..bdc03e192771 100644 --- a/nsprpub/lib/ds/plarena.c +++ b/nsprpub/lib/ds/plarena.c @@ -129,7 +129,15 @@ PR_IMPLEMENT(void) PL_InitArenaPool( pool->first.base = pool->first.avail = pool->first.limit = (PRUword)PL_ARENA_ALIGN(pool, &pool->first + 1); pool->current = &pool->first; - pool->arenasize = size; + /* + * Compute the net size so that each arena's gross size is |size|. + * sizeof(PLArena) + pool->mask is the header and alignment slop + * that PL_ArenaAllocate adds to the net size. + */ + if (size > sizeof(PLArena) + pool->mask) + pool->arenasize = size - (sizeof(PLArena) + pool->mask); + else + pool->arenasize = size; #ifdef PL_ARENAMETER memset(&pool->stats, 0, sizeof pool->stats); pool->stats.name = strdup(name); diff --git a/nsprpub/lib/ds/plarenas.h b/nsprpub/lib/ds/plarenas.h index 9c9eee8ecd6a..f30d2943c243 100644 --- a/nsprpub/lib/ds/plarenas.h +++ b/nsprpub/lib/ds/plarenas.h @@ -44,7 +44,12 @@ typedef struct PLArenaPool PLArenaPool; /* ** Initialize an arena pool with the given name for debugging and metering, -** with a minimum size per arena of size bytes. +** with a minimum gross size per arena of size bytes. The net size per arena +** is smaller than the gross size by a header of four pointers plus any +** necessary padding for alignment. +** +** Note: choose a gross size that's a power of two to avoid the heap allocator +** rounding the size up. **/ PR_EXTERN(void) PL_InitArenaPool( PLArenaPool *pool, const char *name, PRUint32 size, PRUint32 align); diff --git a/nsprpub/lib/msgc/.cvsignore b/nsprpub/lib/msgc/.cvsignore deleted file mode 100644 index f3c7a7c5da68..000000000000 --- a/nsprpub/lib/msgc/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/nsprpub/lib/msgc/Makefile.in b/nsprpub/lib/msgc/Makefile.in deleted file mode 100644 index d7299b2bb56e..000000000000 --- a/nsprpub/lib/msgc/Makefile.in +++ /dev/null @@ -1,52 +0,0 @@ -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape Portable Runtime (NSPR). -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -MOD_DEPTH = ../.. -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(MOD_DEPTH)/config/autoconf.mk - -include $(topsrcdir)/config/config.mk - -DIRS = include src tests - -include $(topsrcdir)/config/rules.mk - -export:: $(TARGETS) - diff --git a/nsprpub/lib/msgc/include/.cvsignore b/nsprpub/lib/msgc/include/.cvsignore deleted file mode 100644 index f3c7a7c5da68..000000000000 --- a/nsprpub/lib/msgc/include/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/nsprpub/lib/msgc/include/Makefile.in b/nsprpub/lib/msgc/include/Makefile.in deleted file mode 100644 index 86e152a590b7..000000000000 --- a/nsprpub/lib/msgc/include/Makefile.in +++ /dev/null @@ -1,57 +0,0 @@ -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape Portable Runtime (NSPR). -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -#! gmake - -MOD_DEPTH = ../../.. -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(MOD_DEPTH)/config/autoconf.mk -include $(topsrcdir)/config/config.mk - -EXPORT_HEADERS = prgc.h -HEADERS = $(EXPORT_HEADERS) gcint.h - -RELEASE_HEADERS = $(EXPORT_HEADERS) -RELEASE_HEADERS_DEST = $(RELEASE_INCLUDE_DIR) - -include $(topsrcdir)/config/rules.mk - -export:: $(EXPORT_HEADERS) - $(INSTALL) -m 444 $(EXPORT_HEADERS) $(dist_includedir) diff --git a/nsprpub/lib/msgc/include/gcint.h b/nsprpub/lib/msgc/include/gcint.h deleted file mode 100644 index 10048f068916..000000000000 --- a/nsprpub/lib/msgc/include/gcint.h +++ /dev/null @@ -1,129 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef gcint_h___ -#define gcint_h___ - -#include "prmon.h" -#include "prgc.h" - -extern PRLogModuleInfo *_pr_msgc_lm; -extern GCInfo _pr_gcData; - -#if defined(_WIN32) && !defined(DEBUG) -#undef INLINE_LOCK -#endif - -#ifdef INLINE_LOCK -#define LOCK_GC() EnterCriticalSection(&_pr_gcData.lock->mutexHandle) -#define UNLOCK_GC() LeaveCriticalSection(&_pr_gcData.lock->mutexHandle) -#else -#define LOCK_GC() PR_EnterMonitor(_pr_gcData.lock) -#define UNLOCK_GC() PR_ExitMonitor (_pr_gcData.lock) -#define GC_IS_LOCKED() (PR_GetMonitorEntryCount(_pr_gcData.lock)!=0) -#endif - -#ifdef DEBUG -#define _GCTRACE(x, y) if (_pr_gcData.flags & x) GCTrace y -#else -#define _GCTRACE(x, y) -#endif - -extern GCBeginGCHook *_pr_beginGCHook; -extern void *_pr_beginGCHookArg; -extern GCBeginGCHook *_pr_endGCHook; -extern void *_pr_endGCHookArg; - -extern GCBeginFinalizeHook *_pr_beginFinalizeHook; -extern void *_pr_beginFinalizeHookArg; -extern GCBeginFinalizeHook *_pr_endFinalizeHook; -extern void *_pr_endFinalizeHookArg; - -extern int _pr_do_a_dump; -extern FILE *_pr_dump_file; - -extern PRLogModuleInfo *_pr_gc_lm; - -/* -** Root finders. Root finders are used by the GC to find pointers into -** the GC heap that are not contained in the GC heap. -*/ -typedef struct RootFinderStr RootFinder; - -struct RootFinderStr { - RootFinder *next; - GCRootFinder *func; - char *name; - void *arg; -}; -extern RootFinder *_pr_rootFinders; - -typedef struct CollectorTypeStr { - GCType gctype; - PRUint32 flags; -} CollectorType; - -#define GC_MAX_TYPES 256 -extern CollectorType *_pr_collectorTypes; - -#define _GC_TYPE_BUSY 0x1 -#define _GC_TYPE_FINAL 0x2 -#define _GC_TYPE_WEAK 0x4 - -/* Slot in _pr_gcTypes used for free memory */ -#define FREE_MEMORY_TYPEIX 255 - -extern void _PR_InitGC(PRWord flags); -extern void _MD_InitGC(void); -extern void PR_CALLBACK _PR_ScanFinalQueue(void *notused); - -/* -** Grow the GC Heap. -*/ -extern void *_MD_GrowGCHeap(PRUint32 *sizep); - -/* -** Extend the GC Heap. -*/ -extern PRBool _MD_ExtendGCHeap(char *base, PRInt32 oldSize, PRInt32 newSize); - -/* -** Free a GC segment. -*/ -extern void _MD_FreeGCSegment(void *base, PRInt32 len); - -#endif /* gcint_h___ */ diff --git a/nsprpub/lib/msgc/include/prgc.h b/nsprpub/lib/msgc/include/prgc.h deleted file mode 100644 index 859f7b1c0dd5..000000000000 --- a/nsprpub/lib/msgc/include/prgc.h +++ /dev/null @@ -1,419 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#ifndef prgc_h___ -#define prgc_h___ - -/* -** API to NSPR gc memory system. -*/ -#include "prtypes.h" -#include "prmon.h" -#include "prthread.h" -#include - -#if defined(WIN16) -#define GCPTR __far -#else -#define GCPTR -#endif - - -PR_BEGIN_EXTERN_C - -/* -** Initialize the garbage collector. -** "flags" is the trace flags (see below). -** "initialHeapSize" is the initial size of the heap and may be zero -** if the default is desired. -** "segmentSize" is the size of each segment of memory added to the -** heap when the heap is grown. -*/ -PR_EXTERN(void) PR_InitGC( - PRWord flags, PRInt32 initialHeapSize, PRInt32 segmentSize, PRThreadScope scope); - -/* -** Shuts down gc and frees up all memory associated with it. -*/ -PR_EXTERN(void) PR_ShutdownGC(PRBool finalizeOnExit); - -/* -** This walk function will be called for every gc object in the -** heap as it is walked. If it returns non-zero, the walk is terminated. -*/ -typedef PRInt32 (*PRWalkFun)(void GCPTR* obj, void* data); - -/* -** GC Type record. This defines all of the GC operations used on a -** particular object type. These structures are passed to -** PR_RegisterType. -*/ -typedef struct GCType { - /* - ** Scan an object that is in the GC heap and call GCInfo.livePointer - ** on all of the pointers in it. If this slot is null then the object - ** won't be scanned (i.e. it has no embedded pointers). - */ - void (PR_CALLBACK *scan)(void GCPTR *obj); - - /* - ** Finalize an object that has no references. This is called by the - ** GC after it has determined where the object debris is but before - ** it has moved the debris to the logical "free list". The object is - ** marked alive for this call and removed from the list of objects - ** that need finalization (finalization only happens once for an - ** object). If this slot is null then the object doesn't need - ** finalization. - */ - void (PR_CALLBACK *finalize)(void GCPTR *obj); - - /* - ** Dump out an object during a PR_DumpGCHeap(). This is used as a - ** debugging tool. - */ - void (PR_CALLBACK *dump)(FILE *out, void GCPTR *obj, PRBool detailed, PRIntn indentLevel); - - /* - ** Add object to summary table. - */ - void (PR_CALLBACK *summarize)(void GCPTR *obj, PRUint32 bytes); - - /* - ** Free hook called by GC when the object is being freed. - */ - void (PR_CALLBACK *free)(void *obj); - - /* Weak pointer support: If the object has a weak pointer (Note: - at most one), this function is used to get the weak link's - offset from the start of the body of a gc object */ - PRUint32 (PR_CALLBACK *getWeakLinkOffset)(void *obj); - - /* Descriptive character for dumping this GCType */ - char kindChar; - - /* - ** Walker routine. This routine should apply fun(obj->ptr, data) - ** for every gc pointer within the object. - */ - PRInt32 (PR_CALLBACK *walk)(void GCPTR *obj, PRWalkFun fun, void* data); -} GCType; - -/* -** This data structure must be added as the hash table passed to -** the summarize method of GCType. -*/ -typedef struct PRSummaryEntry { - void* clazz; - PRInt32 instancesCount; - PRInt32 totalSize; -} PRSummaryEntry; - -/* -** This function pointer must be registered by users of nspr -** to produce the finally summary after all object in the -** heap have been visited. -*/ -typedef void (PR_CALLBACK *PRSummaryPrinter)(FILE *out, void* closure); - -PR_EXTERN(void) PR_CALLBACK PR_RegisterSummaryPrinter(PRSummaryPrinter fun, void* closure); - -typedef void PR_CALLBACK GCRootFinder(void *arg); -typedef void PR_CALLBACK GCBeginFinalizeHook(void *arg); -typedef void PR_CALLBACK GCEndFinalizeHook(void *arg); -typedef void PR_CALLBACK GCBeginGCHook(void *arg); -typedef void PR_CALLBACK GCEndGCHook(void *arg); - -typedef enum { PR_GCBEGIN, PR_GCEND } GCLockHookArg; - -typedef void PR_CALLBACK GCLockHookFunc(GCLockHookArg arg1, void *arg2); - -typedef struct GCLockHook GCLockHook; - -struct GCLockHook { - GCLockHookFunc* func; - void* arg; - GCLockHook* next; - GCLockHook* prev; -}; - - -/* -** Hooks which are called at the beginning and end of the GC process. -** The begin hooks are called before the root finding step. The hooks are -** called with threading disabled, so it is now allowed to re-enter the -** kernel. The end hooks are called after the gc has finished but before -** the finalizer has run. -*/ -PR_EXTERN(void) PR_CALLBACK PR_SetBeginGCHook(GCBeginGCHook *hook, void *arg); -PR_EXTERN(void) PR_CALLBACK PR_GetBeginGCHook(GCBeginGCHook **hook, void **arg); -PR_EXTERN(void) PR_CALLBACK PR_SetEndGCHook(GCBeginGCHook *hook, void *arg); -PR_EXTERN(void) PR_CALLBACK PR_GetEndGCHook(GCEndGCHook **hook, void **arg); - -/* -** Called before SuspendAll is called by dogc, so that GC thread can hold -** all the locks before hand to avoid any deadlocks -*/ - -/* -PR_EXTERN(void) PR_SetGCLockHook(GCLockHook *hook, void *arg); -PR_EXTERN(void) PR_GetGCLockHook(GCLockHook **hook, void **arg); -*/ - -PR_EXTERN(int) PR_RegisterGCLockHook(GCLockHookFunc *hook, void *arg); - -/* -** Hooks which are called at the beginning and end of the GC finalization -** process. After the GC has identified all of the dead objects in the -** heap, it looks for objects that need finalization. Before it calls the -** first finalization proc (see the GCType structure above) it calls the -** begin hook. When it has finalized the last object it calls the end -** hook. -*/ -PR_EXTERN(void) PR_SetBeginFinalizeHook(GCBeginFinalizeHook *hook, void *arg); -PR_EXTERN(void) PR_GetBeginFinalizeHook(GCBeginFinalizeHook **hook, void **arg); -PR_EXTERN(void) PR_SetEndFinalizeHook(GCBeginFinalizeHook *hook, void *arg); -PR_EXTERN(void) PR_GetEndFinalizeHook(GCEndFinalizeHook **hook, void **arg); - -/* -** Register a GC type. Return's the index into the GC internal type -** table. The returned value is passed to PR_AllocMemory. After the call, -** the "type" memory belongs to the GC (the caller must not free it or -** change it). -*/ -PR_EXTERN(PRInt32) PR_RegisterType(GCType *type); - -/* -** Register a root finder with the collector. The collector will call -** these functions to identify all of the roots before collection -** proceeds. "arg" is passed to the function when it is called. -*/ -PR_EXTERN(PRStatus) PR_RegisterRootFinder(GCRootFinder func, char *name, void *arg); - -/* -** Allocate some GC'able memory. The object must be at least bytes in -** size. The type index function for the object is specified. "flags" -** specifies some control flags. If PR_ALLOC_CLEAN is set then the memory -** is zero'd before being returned. If PR_ALLOC_DOUBLE is set then the -** allocated memory is double aligned. -** -** Any memory cell that you store a pointer to something allocated by -** this call must be findable by the GC. Use the PR_RegisterRootFinder to -** register new places where the GC will look for pointers into the heap. -** The GC already knows how to scan any NSPR threads or monitors. -*/ -PR_EXTERN(PRWord GCPTR *)PR_AllocMemory( - PRWord bytes, PRInt32 typeIndex, PRWord flags); -PR_EXTERN(PRWord GCPTR *)PR_AllocSimpleMemory( - PRWord bytes, PRInt32 typeIndex); - -/* -** This function can be used to cause PR_AllocMemory to always return -** NULL. This may be useful in low memory situations when we're trying to -** shutdown applets. -*/ -PR_EXTERN(void) PR_EnableAllocation(PRBool yesOrNo); - -/* flags bits */ -#define PR_ALLOC_CLEAN 0x1 -#define PR_ALLOC_DOUBLE 0x2 -#define PR_ALLOC_ZERO_HANDLE 0x4 /* XXX yes, it's a hack */ - -/* -** Force a garbage collection right now. Return when it completes. -*/ -PR_EXTERN(void) PR_GC(void); - -/* -** Force a finalization right now. Return when finalization has -** completed. Finalization completes when there are no more objects -** pending finalization. This does not mean there are no objects in the -** gc heap that will need finalization should a collection be done after -** this call. -*/ -PR_EXTERN(void) PR_ForceFinalize(void); - -/* -** Dump the GC heap out to the given file. This will stop the system dead -** in its tracks while it is occuring. -*/ -PR_EXTERN(void) PR_DumpGCHeap(FILE *out, PRBool detailed); - -/* -** Wrapper for PR_DumpGCHeap -*/ -PR_EXTERN(void) PR_DumpMemory(PRBool detailed); - -/* -** Dump summary of objects allocated. -*/ -PR_EXTERN(void) PR_DumpMemorySummary(void); - -/* -** Dump the application heaps. -*/ -PR_EXTERN(void) PR_DumpApplicationHeaps(void); - -/* -** Helper function used by dump routines to do the indentation in a -** consistent fashion. -*/ -PR_EXTERN(void) PR_DumpIndent(FILE *out, PRIntn indent); - -/* -** The GCInfo structure contains all of the GC state... -** -** busyMemory: -** The amount of GC heap memory that is busy at this instant. Busy -** doesn't mean alive, it just means that it has been -** allocated. Immediately after a collection busy means how much is -** alive. -** -** freeMemory: -** The amount of GC heap memory that is as yet unallocated. -** -** allocMemory: -** The sum of free and busy memory in the GC heap. -** -** maxMemory: -** The maximum size that the GC heap is allowed to grow. -** -** lowSeg: -** The lowest segment currently used in the GC heap. -** -** highSeg: -** The highest segment currently used in the GC heap. -** The lowSeg and highSeg members are used for a "quick test" of whether -** a pointer falls within the GC heap. [ see GC_IN_HEAP(...) ] -** -** lock: -** Monitor used for synchronization within the GC. -** -** finalizer: -** Thread in which the GC finalizer is running. -** -** liveBlock: -** Object scanning functions call through this function pointer to -** register a potential block of pointers with the collector. (This is -** currently not at all different than processRoot.) -** -** livePointer: -** Object scanning functions call through this function pointer to -** register a single pointer with the collector. -** -** processRootBlock: -** When a root finder identifies a root it should call through this -** function pointer so that the GC can process the root. The call takes -** a base address and count which the gc will examine for valid heap -** pointers. -** -** processRootPointer: -** When a root finder identifies a root it should call through this -** function pointer so that the GC can process the root. The call takes -** a single pointer value. -*/ -typedef struct GCInfoStr { - PRWord flags; /* trace flags (see below) */ - PRWord busyMemory; /* memory in use right now */ - PRWord freeMemory; /* memory free right now */ - PRWord allocMemory; /* sum of busy & free memory */ - PRWord maxMemory; /* max memory we are allowed to allocate */ - PRWord *lowSeg; /* lowest segment in the GC heap */ - PRWord *highSeg; /* highest segment in the GC heap */ - - PRMonitor *lock; - PRThread *finalizer; - - void (PR_CALLBACK *liveBlock)(void **base, PRInt32 count); - void (PR_CALLBACK *livePointer)(void *ptr); - void (PR_CALLBACK *processRootBlock)(void **base, PRInt32 count); - void (PR_CALLBACK *processRootPointer)(void *ptr); - FILE* dumpOutput; -#ifdef GCTIMINGHOOK - void (*gcTimingHook)(int32 gcTime); -#endif -} GCInfo; - -PR_EXTERN(GCInfo *) PR_GetGCInfo(void); -PR_EXTERN(PRBool) PR_GC_In_Heap(void GCPTR *object); - -/* -** Simple bounds check to see if a pointer is anywhere near the GC heap. -** Used to avoid calls to PR_ProcessRoot and GCInfo.livePointer by object -** scanning code. -*/ -#if !defined(XP_PC) || defined(_WIN32) -#define GC_IN_HEAP(_info, _p) (((PRWord*)(_p) >= (_info)->lowSeg) && \ - ((PRWord*)(_p) < (_info)->highSeg)) -#else -/* -** The simple bounds check, above, doesn't work in Win16, because we don't -** maintain: lowSeg == MIN(all segments) and highSeg == MAX(all segments). -** So we have to do a little better. -*/ -#define GC_IN_HEAP(_info, _p) PR_GC_In_Heap(_p) -#endif - -PR_EXTERN(PRWord) PR_GetObjectHeader(void *ptr); - -PR_EXTERN(PRWord) PR_SetObjectHeader(void *ptr, PRWord newUserBits); - -/************************************************************************/ - -/* Trace flags (passed to PR_InitGC or in environment GCLOG) */ -#define GC_TRACE 0x0001 -#define GC_ROOTS 0x0002 -#define GC_LIVE 0x0004 -#define GC_ALLOC 0x0008 -#define GC_MARK 0x0010 -#define GC_SWEEP 0x0020 -#define GC_DEBUG 0x0040 -#define GC_FINAL 0x0080 - -#if defined(DEBUG_kipp) || defined(DEBUG_warren) -#define GC_CHECK 0x0100 -#endif - -#ifdef DEBUG -#define GCTRACE(x, y) if (PR_GetGCInfo()->flags & x) GCTrace y -PR_EXTERN(void) GCTrace(char *fmt, ...); -#else -#define GCTRACE(x, y) -#endif - -PR_END_EXTERN_C - -#endif /* prgc_h___ */ diff --git a/nsprpub/lib/msgc/src/.cvsignore b/nsprpub/lib/msgc/src/.cvsignore deleted file mode 100644 index f3c7a7c5da68..000000000000 --- a/nsprpub/lib/msgc/src/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/nsprpub/lib/msgc/src/Makefile.in b/nsprpub/lib/msgc/src/Makefile.in deleted file mode 100644 index bcc586248d94..000000000000 --- a/nsprpub/lib/msgc/src/Makefile.in +++ /dev/null @@ -1,93 +0,0 @@ -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape Portable Runtime (NSPR). -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -#! gmake - -MOD_DEPTH = ../../.. -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(MOD_DEPTH)/config/autoconf.mk - -include $(topsrcdir)/config/config.mk - -INCLUDES = -I$(dist_includedir) -I../include - -CSRCS = prgcapi.c prmsgc.c - -ifeq ($(OS_ARCH),WINNT) -CSRCS += win32gc.c -else -ifeq ($(OS_ARCH),OS2) -CSRCS += os2gc.c -else -CSRCS += unixgc.c -endif -endif - -NSPR_VERSION = $(MOD_MAJOR_VERSION) - -EXTRA_LIBS = $(LIBNSPR) - -ifdef RESOLVE_LINK_SYMBOLS -EXTRA_LIBS += $(OS_LIBS) -endif - -ifeq ($(OS_ARCH), WINNT) -#RES=$(OBJDIR)/ds.res -#RESNAME=$(MOD_DEPTH)/pr/src/nspr.rc -#OS_LIBS = user32.lib -endif # WINNT - -LIBRARY_NAME = msgc -LIBRARY_VERSION = $(MOD_MAJOR_VERSION) - -RELEASE_LIBS = $(TARGETS) - -include $(topsrcdir)/config/rules.mk - -# -# The Client build wants the shared libraries in $(dist_bindir), -# so we also install them there. -# - -export:: $(TARGETS) - $(INSTALL) -m 444 $(TARGETS) $(dist_libdir) -ifdef SHARED_LIBRARY - $(INSTALL) -m 444 $(SHARED_LIBRARY) $(dist_bindir) -endif diff --git a/nsprpub/lib/msgc/src/os2gc.c b/nsprpub/lib/msgc/src/os2gc.c deleted file mode 100644 index f99bb678661d..000000000000 --- a/nsprpub/lib/msgc/src/os2gc.c +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * GC related routines - * - */ -#include "prlog.h" - -#include - -/* Leave a bit of room for any malloc header bytes... */ -#define MAX_SEGMENT_SIZE (65536L - 4096L) - -/************************************************************************/ -/* -** Machine dependent GC Heap management routines: -** _MD_GrowGCHeap -*/ -/************************************************************************/ -void _MD_InitGC() {} - -void *_MD_GrowGCHeap(PRUint32 *sizep) -{ - void *addr; - - if ( *sizep > MAX_SEGMENT_SIZE ) - { - *sizep = MAX_SEGMENT_SIZE; - } - - addr = malloc((size_t)*sizep); - return addr; -} - - -PRBool _MD_ExtendGCHeap(char *base, PRInt32 oldSize, PRInt32 newSize) { - /* Not sure about this. Todd? */ - return PR_FALSE; -} - - -void _MD_FreeGCSegment(void *base, PRInt32 len) -{ - if (base) - { - free(base); - } -} diff --git a/nsprpub/lib/msgc/src/prgcapi.c b/nsprpub/lib/msgc/src/prgcapi.c deleted file mode 100644 index 324ac7b9303c..000000000000 --- a/nsprpub/lib/msgc/src/prgcapi.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include -#include -#include "prenv.h" -#include "prmem.h" -#include "prmon.h" -#include "prlog.h" -#include "prthread.h" -#include "private/pprthred.h" -#include "gcint.h" - -/* -** Generic GC implementation independent code for the NSPR GC -*/ - -RootFinder *_pr_rootFinders; - -CollectorType *_pr_collectorTypes; - -/* GC State information */ -GCInfo _pr_gcData; - -GCBeginGCHook *_pr_beginGCHook; -void *_pr_beginGCHookArg; -GCBeginGCHook *_pr_endGCHook; -void *_pr_endGCHookArg; - -GCBeginFinalizeHook *_pr_beginFinalizeHook; -void *_pr_beginFinalizeHookArg; -GCBeginFinalizeHook *_pr_endFinalizeHook; -void *_pr_endFinalizeHookArg; - -FILE *_pr_dump_file; -int _pr_do_a_dump; -GCLockHook *_pr_GCLockHook; - -extern PRLogModuleInfo *_pr_msgc_lm; - -/************************************************************************/ - -static PRStatus PR_CALLBACK -pr_ScanOneThread(PRThread* t, void** addr, PRUword count, void* closure) -{ - _pr_gcData.processRootBlock(addr, count); - return PR_SUCCESS; -} - -/* -** Scan all of the threads C stack's and registers, looking for "root" -** pointers into the GC heap. These are the objects that the GC cannot -** move and are considered "live" by the GC. Caller has stopped all of -** the threads from running. -*/ -static void PR_CALLBACK ScanThreads(void *arg) -{ - PR_ScanStackPointers(pr_ScanOneThread, arg); -} - -/************************************************************************/ - -PR_IMPLEMENT(GCInfo *) PR_GetGCInfo(void) -{ - return &_pr_gcData; -} - - -PR_IMPLEMENT(PRInt32) PR_RegisterType(GCType *t) -{ - CollectorType *ct, *ect; - int rv = -1; - - LOCK_GC(); - ct = &_pr_collectorTypes[0]; - ect = &_pr_collectorTypes[FREE_MEMORY_TYPEIX]; - for (; ct < ect; ct++) { - if (ct->flags == 0) { - ct->gctype = *t; - ct->flags = _GC_TYPE_BUSY; - if (0 != ct->gctype.finalize) { - ct->flags |= _GC_TYPE_FINAL; - } - if (0 != ct->gctype.getWeakLinkOffset) { - ct->flags |= _GC_TYPE_WEAK; - } - rv = ct - &_pr_collectorTypes[0]; - break; - } - } - UNLOCK_GC(); - return rv; -} - -PR_IMPLEMENT(PRStatus) PR_RegisterRootFinder( - GCRootFinder f, char *name, void *arg) -{ - RootFinder *rf = PR_NEWZAP(RootFinder); - if (rf) { - rf->func = f; - rf->name = name; - rf->arg = arg; - - LOCK_GC(); - rf->next = _pr_rootFinders; - _pr_rootFinders = rf; - UNLOCK_GC(); - return PR_SUCCESS; - } - return PR_FAILURE; -} - - -PR_IMPLEMENT(int) PR_RegisterGCLockHook(GCLockHookFunc* f, void *arg) -{ - - GCLockHook *rf = 0; - - rf = (GCLockHook*) calloc(1, sizeof(GCLockHook)); - if (rf) { - rf->func = f; - rf->arg = arg; - - LOCK_GC(); - /* first dummy node */ - if (! _pr_GCLockHook) { - _pr_GCLockHook = (GCLockHook*) calloc(1, sizeof(GCLockHook)); - _pr_GCLockHook->next = _pr_GCLockHook; - _pr_GCLockHook->prev = _pr_GCLockHook; - } - - rf->next = _pr_GCLockHook; - rf->prev = _pr_GCLockHook->prev; - _pr_GCLockHook->prev->next = rf; - _pr_GCLockHook->prev = rf; - UNLOCK_GC(); - return 0; - } - return -1; -} - -/* -PR_IMPLEMENT(void) PR_SetGCLockHook(GCLockHook *hook, void *arg) -{ - LOCK_GC(); - _pr_GCLockHook = hook; - _pr_GCLockHookArg2 = arg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_GetGCLockHook(GCLockHook **hook, void **arg) -{ - LOCK_GC(); - *hook = _pr_GCLockHook; - *arg = _pr_GCLockHookArg2; - UNLOCK_GC(); -} -*/ - - -PR_IMPLEMENT(void) PR_SetBeginGCHook(GCBeginGCHook *hook, void *arg) -{ - LOCK_GC(); - _pr_beginGCHook = hook; - _pr_beginGCHookArg = arg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_GetBeginGCHook(GCBeginGCHook **hook, void **arg) -{ - LOCK_GC(); - *hook = _pr_beginGCHook; - *arg = _pr_beginGCHookArg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_SetEndGCHook(GCEndGCHook *hook, void *arg) -{ - LOCK_GC(); - _pr_endGCHook = hook; - _pr_endGCHookArg = arg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_GetEndGCHook(GCEndGCHook **hook, void **arg) -{ - LOCK_GC(); - *hook = _pr_endGCHook; - *arg = _pr_endGCHookArg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_SetBeginFinalizeHook(GCBeginFinalizeHook *hook, void *arg) -{ - LOCK_GC(); - _pr_beginFinalizeHook = hook; - _pr_beginFinalizeHookArg = arg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_GetBeginFinalizeHook(GCBeginFinalizeHook **hook, - void **arg) -{ - LOCK_GC(); - *hook = _pr_beginFinalizeHook; - *arg = _pr_beginFinalizeHookArg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_SetEndFinalizeHook(GCEndFinalizeHook *hook, void *arg) -{ - LOCK_GC(); - _pr_endFinalizeHook = hook; - _pr_endFinalizeHookArg = arg; - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) PR_GetEndFinalizeHook(GCEndFinalizeHook **hook, void **arg) -{ - LOCK_GC(); - *hook = _pr_endFinalizeHook; - *arg = _pr_endFinalizeHookArg; - UNLOCK_GC(); -} - -#ifdef DEBUG -#include "prprf.h" - -PR_IMPLEMENT(void) GCTrace(char *fmt, ...) -{ - va_list ap; - char buf[400]; - - va_start(ap, fmt); - PR_vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("%s", buf)); -} -#endif - -void _PR_InitGC(PRWord flags) -{ - static char firstTime = 1; - - if (!firstTime) return; - firstTime = 0; - - _MD_InitGC(); - - if (flags == 0) { - char *ev = PR_GetEnv("GCLOG"); - if (ev && ev[0]) { - flags = atoi(ev); - } - } - _pr_gcData.flags = flags; - - _pr_gcData.lock = PR_NewMonitor(); - - _pr_collectorTypes = (CollectorType*) PR_CALLOC(256 * sizeof(CollectorType)); - - PR_RegisterRootFinder(ScanThreads, "scan threads", 0); - PR_RegisterRootFinder(_PR_ScanFinalQueue, "scan final queue", 0); -} - -extern void pr_FinalizeOnExit(void); - -#ifdef DEBUG -#ifdef GC_STATS -PR_PUBLIC_API(void) PR_PrintGCAllocStats(void); -#endif -#endif - -PR_IMPLEMENT(void) -PR_ShutdownGC(PRBool finalizeOnExit) -{ - /* first finalize all the objects in the heap */ - if (finalizeOnExit) { - pr_FinalizeOnExit(); - } - -#ifdef DEBUG -#ifdef GC_STATS - PR_PrintGCAllocStats(); -#endif /* GC_STATS */ -#endif /* DEBUG */ - - /* then the chance for any future allocations */ - - /* finally delete the gc heap */ - - /* write me */ -} - -/******************************************************************************/ diff --git a/nsprpub/lib/msgc/src/prmsgc.c b/nsprpub/lib/msgc/src/prmsgc.c deleted file mode 100644 index 2c1e85397591..000000000000 --- a/nsprpub/lib/msgc/src/prmsgc.c +++ /dev/null @@ -1,3320 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include -#include -#include - -#ifdef WIN32 -#include -#include -#endif - -#include "prclist.h" -#include "prbit.h" - -#include "prtypes.h" -#include "prenv.h" -#include "prgc.h" -#include "prthread.h" -#include "prlog.h" -#include "prlong.h" -#include "prinrval.h" -#include "prprf.h" -#include "gcint.h" - -#include "private/pprthred.h" - -typedef void (*PRFileDumper)(FILE *out, PRBool detailed); - -PR_EXTERN(void) -PR_DumpToFile(char* filename, char* msg, PRFileDumper dump, PRBool detailed); - -/* -** Mark&sweep garbage collector. Supports objects that require -** finalization, objects that can have a single weak link, and special -** objects that require care during sweeping. -*/ - -PRLogModuleInfo *_pr_msgc_lm; -PRLogModuleInfo* GC; - -static PRInt32 _pr_pageShift; -static PRInt32 _pr_pageSize; - -#ifdef DEBUG -#define GCMETER -#endif -#ifdef DEBUG_jwz -# undef GCMETER -#endif /* 1 */ - -#ifdef GCMETER -#define METER(x) x -#else -#define METER(x) -#endif - -/* -** Make this constant bigger to reduce the amount of recursion during -** garbage collection. -*/ -#define MAX_SCAN_Q 100L - -#if defined(XP_PC) && !defined(WIN32) -#define MAX_SEGS 400L -#define MAX_SEGMENT_SIZE (65536L - 4096L) -#define SEGMENT_SIZE (65536L - 4096L) -#define MAX_ALLOC_SIZE (65536L - 4096L) -#else -#define MAX_SEGS 400L -#define MAX_SEGMENT_SIZE (2L * 256L * 1024L) -#define SEGMENT_SIZE (1L * 256L * 1024L) -#define MAX_ALLOC_SIZE (4L * 1024L * 1024L) -#endif - -/* - * The highest value that can fit into a signed integer. This - * is used to prevent overflow of allocation size in alloc routines. - */ - -#define MAX_INT ((1UL << (PR_BITS_PER_INT - 1)) - 1) - -/* - * On 32-bit machines, only 22 bits are used in the cibx integer to - * store size since 8 bits of the integer are used to store type, and - * of the remainder, 2 are user defined. Max allocation size = 2^22 -1 - */ - -#define MAX_ALLOC ( (1L << (PR_BYTES_PER_WORD_LOG2 + WORDS_BITS )) -1) - -/* The minimum percentage of free heap space after a collection. If - the amount of free space doesn't meet this criteria then we will - attempt to grow the heap */ -#define MIN_FREE_THRESHOLD_AFTER_GC 20L - -static PRInt32 segmentSize = SEGMENT_SIZE; - -static PRInt32 collectorCleanupNeeded; - -#ifdef GCMETER -PRUint32 _pr_gcMeter; - -#define _GC_METER_STATS 0x01L -#define _GC_METER_GROWTH 0x02L -#define _GC_METER_FREE_LIST 0x04L -#endif - -/************************************************************************/ - -#define LINEAR_BIN_EXPONENT 5 -#define NUM_LINEAR_BINS ((PRUint32)1 << LINEAR_BIN_EXPONENT) -#define FIRST_LOG_BIN (NUM_LINEAR_BINS - LINEAR_BIN_EXPONENT) - -/* Each free list bin holds a chunk of memory sized from - 2^n to (2^(n+1))-1 inclusive. */ -#define NUM_BINS (FIRST_LOG_BIN + 32) - -/* - * Find the bin number for a given size (in bytes). This does not round up as - * values from 2^n to (2^(n+1))-1 share the same bin. - */ -#define InlineBinNumber(_bin,_bytes) \ -{ \ - PRUint32 _t, _n = (PRUint32) _bytes / 4; \ - if (_n < NUM_LINEAR_BINS) { \ - _bin = _n; \ - } else { \ - _bin = FIRST_LOG_BIN; \ - if ((_t = (_n >> 16)) != 0) { _bin += 16; _n = _t; } \ - if ((_t = (_n >> 8)) != 0) { _bin += 8; _n = _t; } \ - if ((_t = (_n >> 4)) != 0) { _bin += 4; _n = _t; } \ - if ((_t = (_n >> 2)) != 0) { _bin += 2; _n = _t; } \ - if ((_n >> 1) != 0) _bin++; \ - } \ -} - -#define BIG_ALLOC 16384L - -#define MIN_FREE_CHUNK_BYTES ((PRInt32)sizeof(GCFreeChunk)) - -/* Note: fix code in PR_AllocMemory if you change the size of GCFreeChunk - so that it zeros the right number of words */ -typedef struct GCFreeChunk { - struct GCFreeChunk *next; - struct GCSeg *segment; - PRInt32 chunkSize; -} GCFreeChunk; - -typedef struct GCSegInfo { - struct GCSegInfo *next; - char *base; - char *limit; - PRWord *hbits; - int fromMalloc; -} GCSegInfo; - -typedef struct GCSeg { - char *base; - char *limit; - PRWord *hbits; - GCSegInfo *info; -} GCSeg; - -#ifdef GCMETER -typedef struct GCMeter { - PRInt32 allocBytes; - PRInt32 wastedBytes; - PRInt32 numFreeChunks; - PRInt32 skippedFreeChunks; -} GCMeter; -static GCMeter meter; -#endif - -/* -** There is one of these for each segment of GC'able memory. -*/ -static GCSeg segs[MAX_SEGS]; -static GCSegInfo *freeSegs; -static GCSeg* lastInHeap; -static int nsegs; - -static GCFreeChunk *bins[NUM_BINS]; -static PRInt32 minBin; -static PRInt32 maxBin; - -/* -** Scan Q used to avoid deep recursion when scanning live objects for -** heap pointers -*/ -typedef struct GCScanQStr { - PRWord *q[MAX_SCAN_Q]; - int queued; -} GCScanQ; - -static GCScanQ *pScanQ; - -#ifdef GCMETER -PRInt32 _pr_maxScanDepth; -PRInt32 _pr_scanDepth; -#endif - -/* -** Keeps track of the number of bytes allocated via the BigAlloc() -** allocator. When the number of bytes allocated, exceeds the -** BIG_ALLOC_GC_SIZE, then a GC will occur before the next allocation -** is done... -*/ -#define BIG_ALLOC_GC_SIZE (4*SEGMENT_SIZE) -static PRWord bigAllocBytes = 0; - -/* -** There is one GC header word in front of each GC allocated object. We -** use it to contain information about the object (what TYPEIX to use for -** scanning it, how big it is, it's mark status, and if it's a root). -*/ -#define TYPEIX_BITS 8L -#define WORDS_BITS 20L -#define MAX_CBS (1L << GC_TYPEIX_BITS) -#define MAX_WORDS (1L << GC_WORDS_BITS) -#define TYPEIX_SHIFT 24L -#define MAX_TYPEIX ((1L << TYPEIX_BITS) - 1L) -#define TYPEIX_MASK PR_BITMASK(TYPEIX_BITS) -#define WORDS_SHIFT 2L -#define WORDS_MASK PR_BITMASK(WORDS_BITS) -#define MARK_BIT 1L -#define FINAL_BIT 2L - -/* Two bits per object header are reserved for the user of the memory - system to store information into. */ -#define GC_USER_BITS_SHIFT 22L -#define GC_USER_BITS 0x00c00000L - -#define MAKE_HEADER(_cbix,_words) \ - ((PRWord) (((unsigned long)(_cbix) << TYPEIX_SHIFT) \ - | ((unsigned long)(_words) << WORDS_SHIFT))) - -#define GET_TYPEIX(_h) \ - (((PRUword)(_h) >> TYPEIX_SHIFT) & 0xff) - -#define MARK(_sp,_p) \ - (((PRWord *)(_p))[0] |= MARK_BIT) -#define IS_MARKED(_sp,_p) \ - (((PRWord *)(_p))[0] & MARK_BIT) -#define OBJ_BYTES(_h) \ - (((PRInt32) (_h) & 0x003ffffcL) << (PR_BYTES_PER_WORD_LOG2-2L)) - -#define GC_GET_USER_BITS(_h) (((_h) & GC_USER_BITS) >> GC_USER_BITS_SHIFT) - -/************************************************************************/ - -/* -** Mark the start of an object in a segment. Note that we mark the header -** word (which we always have), not the data word (which we may not have -** for empty objects). -** XXX tune: put subtract of _sp->base into _sp->hbits pointer? -*/ -#define SET_HBIT(_sp,_ph) \ - SET_BIT((_sp)->hbits, (((PRWord*)(_ph)) - ((PRWord*) (_sp)->base))) - -#define CLEAR_HBIT(_sp,_ph) \ - CLEAR_BIT((_sp)->hbits, (((PRWord*)(_ph)) - ((PRWord*) (_sp)->base))) - -#define IS_HBIT(_sp,_ph) \ - TEST_BIT((_sp)->hbits, (((PRWord*)(_ph)) - ((PRWord*) (_sp)->base))) - -/* -** Given a pointer into this segment, back it up until we are at the -** start of the object the pointer points into. Each heap segment has a -** bitmap that has one bit for each word of the objects it contains. The -** bit's are set for the firstword of an object, and clear for it's other -** words. -*/ -static PRWord *FindObject(GCSeg *sp, PRWord *p) -{ - PRWord *base; - - /* Align p to it's proper boundary before we start fiddling with it */ - p = (PRWord*) ((PRWord)p & ~(PR_BYTES_PER_WORD-1L)); - - base = (PRWord *) sp->base; - do { - if (IS_HBIT(sp, p)) { - return (p); - } - p--; - } while ( p >= base ); - - /* Heap is corrupted! */ - _GCTRACE(GC_TRACE, ("ERROR: The heap is corrupted!!! aborting now!")); - abort(); - return NULL; -} - -/************************************************************************/ -#if !defined(XP_PC) || defined(XP_OS2) -#define OutputDebugString(msg) -#endif - -#define IN_SEGMENT(_sp, _p) \ - ((((char *)(_p)) >= (_sp)->base) && \ - (((char *)(_p)) < (_sp)->limit)) - -static GCSeg *InHeap(void *p) -{ - GCSeg *sp, *esp; - - if (lastInHeap && IN_SEGMENT(lastInHeap, p)) { - return lastInHeap; - } - - sp = segs; - esp = segs + nsegs; - for (; sp < esp; sp++) { - if (IN_SEGMENT(sp, p)) { - lastInHeap = sp; - return sp; - } - } - return 0; -} - -/* -** Grow the heap by allocating another segment. Fudge the requestedSize -** value to try to pre-account for the HBITS. -*/ -static GCSeg* DoGrowHeap(PRInt32 requestedSize, PRBool exactly) -{ - GCSeg *sp; - GCSegInfo *segInfo; - GCFreeChunk *cp; - char *base; - PRWord *hbits; - PRInt32 nhbytes, nhbits; - PRUint32 allocSize; - - if (nsegs == MAX_SEGS) { - /* No room for more segments */ - return 0; - } - - segInfo = (GCSegInfo*) PR_MALLOC(sizeof(GCSegInfo)); -#ifdef DEBUG - { - char str[256]; - sprintf(str, "[1] Allocated %ld bytes at %p\n", - (long) sizeof(GCSegInfo), segInfo); - OutputDebugString(str); - } -#endif - if (!segInfo) { - return 0; - } - - /* Get more memory from the OS */ - if (exactly) { - allocSize = requestedSize; - base = (char *) PR_MALLOC(requestedSize); - } else { - allocSize = requestedSize; - allocSize = (allocSize + _pr_pageSize - 1L) >> _pr_pageShift; - allocSize <<= _pr_pageShift; - base = (char*)_MD_GrowGCHeap(&allocSize); - } - if (!base) { - PR_DELETE(segInfo); - return 0; - } - - nhbits = (PRInt32)( - (allocSize + PR_BYTES_PER_WORD - 1L) >> PR_BYTES_PER_WORD_LOG2); - nhbytes = ((nhbits + PR_BITS_PER_WORD - 1L) >> PR_BITS_PER_WORD_LOG2) - * sizeof(PRWord); - - /* Get bitmap memory from malloc heap */ - hbits = (PRWord *) PR_CALLOC((PRUint32)nhbytes); - if (!hbits) { - /* Loser! */ - PR_DELETE(segInfo); - if (exactly) { - PR_DELETE(base); - } else { - /* XXX do something about this */ - /* _MD_FreeGCSegment(base, allocSize); */ - } - return 0; - } - - /* - ** Setup new segment. - */ - sp = &segs[nsegs++]; - segInfo->base = sp->base = base; - segInfo->limit = sp->limit = base + allocSize; - segInfo->hbits = sp->hbits = hbits; - sp->info = segInfo; - segInfo->fromMalloc = exactly; - memset(base, 0, allocSize); - -#ifdef GCMETER - if (_pr_gcMeter & _GC_METER_GROWTH) { - fprintf(stderr, "[GC: new segment base=%p size=%ld]\n", - sp->base, (long) allocSize); - } -#endif - - _pr_gcData.allocMemory += allocSize; - _pr_gcData.freeMemory += allocSize; - - if (!exactly) { - PRInt32 bin; - - /* Put free memory into a freelist bin */ - cp = (GCFreeChunk *) base; - cp->segment = sp; - cp->chunkSize = allocSize; - InlineBinNumber(bin, allocSize) - cp->next = bins[bin]; - bins[bin] = cp; - if (bin < minBin) minBin = bin; - if (bin > maxBin) maxBin = bin; - } else { - /* - ** When exactly allocating the entire segment is given over to a - ** single object to prevent fragmentation - */ - } - - if (!_pr_gcData.lowSeg) { - _pr_gcData.lowSeg = (PRWord*) sp->base; - _pr_gcData.highSeg = (PRWord*) sp->limit; - } else { - if ((PRWord*)sp->base < _pr_gcData.lowSeg) { - _pr_gcData.lowSeg = (PRWord*) sp->base; - } - if ((PRWord*)sp->limit > _pr_gcData.highSeg) { - _pr_gcData.highSeg = (PRWord*) sp->limit; - } - } - - /* - ** Get rid of the GC pointer in case it shows up in some uninitialized - ** local stack variable later (while scanning the C stack looking for - ** roots). - */ - memset(&base, 0, sizeof(base)); /* optimizers beware */ - - PR_LOG(_pr_msgc_lm, PR_LOG_WARNING, ("grow heap: total gc memory now %d", - _pr_gcData.allocMemory)); - - return sp; -} - -#ifdef USE_EXTEND_HEAP -static PRBool ExtendHeap(PRInt32 requestedSize) { - GCSeg* sp; - PRUint32 allocSize; - PRInt32 oldSize, newSize; - PRInt32 newHBits, newHBytes; - PRInt32 oldHBits, oldHBytes; - PRWord* hbits; - GCFreeChunk* cp; - PRInt32 bin; - - /* Can't extend nothing */ - if (nsegs == 0) return PR_FALSE; - - /* Round up requested size to the size of a page */ - allocSize = (PRUint32) requestedSize; - allocSize = (allocSize + _pr_pageSize - 1L) >> _pr_pageShift; - allocSize <<= _pr_pageShift; - - /* Malloc some memory for the new hbits array */ - sp = segs; - oldSize = sp->limit - sp->base; - newSize = oldSize + allocSize; - newHBits = (newSize + PR_BYTES_PER_WORD - 1L) >> PR_BYTES_PER_WORD_LOG2; - newHBytes = ((newHBits + PR_BITS_PER_WORD - 1L) >> PR_BITS_PER_WORD_LOG2) - * sizeof(PRWord); - hbits = (PRWord*) PR_MALLOC(newHBytes); - if (0 == hbits) return PR_FALSE; - - /* Attempt to extend the last segment by the desired amount */ - if (_MD_ExtendGCHeap(sp->base, oldSize, newSize)) { - oldHBits = (oldSize + PR_BYTES_PER_WORD - 1L) >> PR_BYTES_PER_WORD_LOG2; - oldHBytes = ((oldHBits + PR_BITS_PER_WORD - 1L) >> PR_BITS_PER_WORD_LOG2) - * sizeof(PRWord); - - /* Copy hbits from old memory into new memory */ - memset(hbits, 0, newHBytes); - memcpy(hbits, sp->hbits, oldHBytes); - PR_DELETE(sp->hbits); - memset(sp->base + oldSize, 0, allocSize); - - /* Adjust segment state */ - sp->limit += allocSize; - sp->hbits = hbits; - sp->info->limit = sp->limit; - sp->info->hbits = hbits; - - /* Put free memory into a freelist bin */ - cp = (GCFreeChunk *) (sp->base + oldSize); - cp->segment = sp; - cp->chunkSize = allocSize; - InlineBinNumber(bin, allocSize) - cp->next = bins[bin]; - bins[bin] = cp; - if (bin < minBin) minBin = bin; - if (bin > maxBin) maxBin = bin; - - /* Prevent a pointer that points to the free memory from showing - up on the call stack later on */ - memset(&cp, 0, sizeof(cp)); - - /* Update heap brackets and counters */ - if ((PRWord*)sp->limit > _pr_gcData.highSeg) { - _pr_gcData.highSeg = (PRWord*) sp->limit; - } - _pr_gcData.allocMemory += allocSize; - _pr_gcData.freeMemory += allocSize; - - return PR_TRUE; - } - PR_DELETE(hbits); - return PR_FALSE; -} -#endif /* USE_EXTEND_HEAP */ - -static GCSeg *GrowHeapExactly(PRInt32 requestedSize) -{ - GCSeg *sp = DoGrowHeap(requestedSize, PR_TRUE); - return sp; -} - -static PRBool GrowHeap(PRInt32 requestedSize) -{ - void *p; -#ifdef USE_EXTEND_HEAP - if (ExtendHeap(requestedSize)) { - return PR_TRUE; - } -#endif - p = DoGrowHeap(requestedSize, PR_FALSE); - return (p != NULL ? PR_TRUE : PR_FALSE); -} - -/* -** Release a segment when it is entirely free. -*/ -static void ShrinkGCHeap(GCSeg *sp) -{ -#ifdef GCMETER - if (_pr_gcMeter & _GC_METER_GROWTH) { - fprintf(stderr, "[GC: free segment base=%p size=%ld]\n", - sp->base, (long) (sp->limit - sp->base)); - } -#endif - - /* - * Put segment onto free seginfo list (we can't call free right now - * because we have the GC lock and all of the other threads are - * suspended; if one of them has the malloc lock we would deadlock) - */ - sp->info->next = freeSegs; - freeSegs = sp->info; - collectorCleanupNeeded = 1; - _pr_gcData.allocMemory -= sp->limit - sp->base; - if (sp == lastInHeap) lastInHeap = 0; - - /* Squish out disappearing segment from segment table */ - --nsegs; - if ((sp - segs) != nsegs) { - *sp = segs[nsegs]; - } else { - sp->base = 0; - sp->limit = 0; - sp->hbits = 0; - sp->info = 0; - } - - /* Recalculate the lowSeg and highSeg values */ - _pr_gcData.lowSeg = (PRWord*) segs[0].base; - _pr_gcData.highSeg = (PRWord*) segs[0].limit; - for (sp = segs; sp < &segs[nsegs]; sp++) { - if ((PRWord*)sp->base < _pr_gcData.lowSeg) { - _pr_gcData.lowSeg = (PRWord*) sp->base; - } - if ((PRWord*)sp->limit > _pr_gcData.highSeg) { - _pr_gcData.highSeg = (PRWord*) sp->limit; - } - } -} - -static void FreeSegments(void) -{ - GCSegInfo *si; - - while (0 != freeSegs) { - LOCK_GC(); - si = freeSegs; - if (si) { - freeSegs = si->next; - } - UNLOCK_GC(); - - if (!si) { - break; - } - PR_DELETE(si->base); - PR_DELETE(si->hbits); - PR_DELETE(si); - } -} - -/************************************************************************/ - -void ScanScanQ(GCScanQ *iscan) -{ - PRWord *p; - PRWord **pp; - PRWord **epp; - GCScanQ nextQ, *scan, *next, *temp; - CollectorType *ct; - - if (!iscan->queued) return; - - _GCTRACE(GC_MARK, ("begin scanQ @ 0x%x (%d)", iscan, iscan->queued)); - scan = iscan; - next = &nextQ; - while (scan->queued) { - _GCTRACE(GC_MARK, ("continue scanQ @ 0x%x (%d)", scan, scan->queued)); - /* - * Set pointer to current scanQ so that _pr_gcData.livePointer - * can find it. - */ - pScanQ = next; - next->queued = 0; - - /* Now scan the scan Q */ - pp = scan->q; - epp = &scan->q[scan->queued]; - scan->queued = 0; - while (pp < epp) { - p = *pp++; - ct = &_pr_collectorTypes[GET_TYPEIX(p[0])]; - PR_ASSERT(0 != ct->gctype.scan); - /* Scan object ... */ - (*ct->gctype.scan)(p + 1); - } - - /* Exchange pointers so that we scan next */ - temp = scan; - scan = next; - next = temp; - } - - pScanQ = iscan; - PR_ASSERT(nextQ.queued == 0); - PR_ASSERT(iscan->queued == 0); -} - -/* -** Called during root finding step to identify "root" pointers into the -** GC heap. First validate if it is a real heap pointer and then mark the -** object being pointed to and add it to the scan Q for eventual -** scanning. -*/ -static void PR_CALLBACK ProcessRootBlock(void **base, PRInt32 count) -{ - GCSeg *sp; - PRWord *p0, *p, h, tix, *low, *high, *segBase; - CollectorType *ct; -#ifdef DEBUG - void **base0 = base; -#endif - - low = _pr_gcData.lowSeg; - high = _pr_gcData.highSeg; - while (--count >= 0) { - p0 = (PRWord*) *base++; - if (p0 < low) continue; /* below gc heap */ - if (p0 >= high) continue; /* above gc heap */ - /* NOTE: inline expansion of InHeap */ - /* Find segment */ - sp = lastInHeap; - if (!sp || !IN_SEGMENT(sp,p0)) { - GCSeg *esp; - sp = segs; - esp = segs + nsegs; - for (; sp < esp; sp++) { - if (IN_SEGMENT(sp, p0)) { - lastInHeap = sp; - goto find_object; - } - } - continue; - } - - find_object: - /* NOTE: Inline expansion of FindObject */ - /* Align p to it's proper boundary before we start fiddling with it */ - p = (PRWord*) ((PRWord)p0 & ~(PR_BYTES_PER_WORD-1L)); - segBase = (PRWord *) sp->base; - do { - if (IS_HBIT(sp, p)) { - goto winner; - } - p--; - } while (p >= segBase); - - /* - ** We have a pointer into the heap, but it has no header - ** bit. This means that somehow the very first object in the heap - ** doesn't have a header. This is impossible so when debugging - ** lets abort. - */ -#ifdef DEBUG - PR_Abort(); -#endif - - winner: - h = p[0]; - if ((h & MARK_BIT) == 0) { -#ifdef DEBUG - _GCTRACE(GC_ROOTS, - ("root 0x%p (%d) base0=%p off=%d", - p, OBJ_BYTES(h), base0, (base-1) - base0)); -#endif - - /* Mark the root we just found */ - p[0] = h | MARK_BIT; - - /* - * See if object we just found needs scanning. It must - * have a scan function to be placed on the scanQ. - */ - tix = (PRWord)GET_TYPEIX(h); - ct = &_pr_collectorTypes[tix]; - if (0 == ct->gctype.scan) { - continue; - } - - /* - ** Put a pointer onto the scan Q. We use the scan Q to avoid - ** deep recursion on the C call stack. Objects are added to - ** the scan Q until the scan Q fills up. At that point we - ** make a call to ScanScanQ which proceeds to scan each of - ** the objects in the Q. This limits the recursion level by a - ** large amount though the stack frames get larger to hold - ** the GCScanQ's. - */ - pScanQ->q[pScanQ->queued++] = p; - if (pScanQ->queued == MAX_SCAN_Q) { - METER(_pr_scanDepth++); - ScanScanQ(pScanQ); - } - } - } -} - -static void PR_CALLBACK ProcessRootPointer(void *ptr) -{ - PRWord *p0, *p, h, tix, *segBase; - GCSeg* sp; - CollectorType *ct; - - p0 = (PRWord*) ptr; - - if (p0 < _pr_gcData.lowSeg) return; /* below gc heap */ - if (p0 >= _pr_gcData.highSeg) return; /* above gc heap */ - - /* NOTE: inline expansion of InHeap */ - /* Find segment */ - sp = lastInHeap; - if (!sp || !IN_SEGMENT(sp,p0)) { - GCSeg *esp; - sp = segs; - esp = segs + nsegs; - for (; sp < esp; sp++) { - if (IN_SEGMENT(sp, p0)) { - lastInHeap = sp; - goto find_object; - } - } - return; - } - - find_object: - /* NOTE: Inline expansion of FindObject */ - /* Align p to it's proper boundary before we start fiddling with it */ - p = (PRWord*) ((PRWord)p0 & ~(BYTES_PER_WORD-1L)); - segBase = (PRWord *) sp->base; - do { - if (IS_HBIT(sp, p)) { - goto winner; - } - p--; - } while (p >= segBase); - - /* - ** We have a pointer into the heap, but it has no header - ** bit. This means that somehow the very first object in the heap - ** doesn't have a header. This is impossible so when debugging - ** lets abort. - */ -#ifdef DEBUG - PR_Abort(); -#endif - - winner: - h = p[0]; - if ((h & MARK_BIT) == 0) { -#ifdef DEBUG - _GCTRACE(GC_ROOTS, ("root 0x%p (%d)", p, OBJ_BYTES(h))); -#endif - - /* Mark the root we just found */ - p[0] = h | MARK_BIT; - - /* - * See if object we just found needs scanning. It must - * have a scan function to be placed on the scanQ. - */ - tix = (PRWord)GET_TYPEIX(h); - ct = &_pr_collectorTypes[tix]; - if (0 == ct->gctype.scan) { - return; - } - - /* - ** Put a pointer onto the scan Q. We use the scan Q to avoid - ** deep recursion on the C call stack. Objects are added to - ** the scan Q until the scan Q fills up. At that point we - ** make a call to ScanScanQ which proceeds to scan each of - ** the objects in the Q. This limits the recursion level by a - ** large amount though the stack frames get larger to hold - ** the GCScanQ's. - */ - pScanQ->q[pScanQ->queued++] = p; - if (pScanQ->queued == MAX_SCAN_Q) { - METER(_pr_scanDepth++); - ScanScanQ(pScanQ); - } - } -} - -/************************************************************************/ - -/* -** Empty the freelist for each segment. This is done to make sure that -** the root finding step works properly (otherwise, if we had a pointer -** into a free section, we might not find its header word and abort in -** FindObject) -*/ -static void EmptyFreelists(void) -{ - GCFreeChunk *cp; - GCFreeChunk *next; - GCSeg *sp; - PRWord *p; - PRInt32 chunkSize; - PRInt32 bin; - - /* - ** Run over the freelist and make all of the free chunks look like - ** object debris. - */ - for (bin = 0; bin <= NUM_BINS-1; bin++) { - cp = bins[bin]; - while (cp) { - next = cp->next; - sp = cp->segment; - chunkSize = cp->chunkSize >> BYTES_PER_WORD_LOG2; - p = (PRWord*) cp; - PR_ASSERT(chunkSize != 0); - p[0] = MAKE_HEADER(FREE_MEMORY_TYPEIX, chunkSize); - SET_HBIT(sp, p); - cp = next; - } - bins[bin] = 0; - } - minBin = NUM_BINS - 1; - maxBin = 0; -} - -typedef struct GCBlockEnd { - PRInt32 check; -#ifdef GC_CHECK - PRInt32 requestedBytes; -#endif -#ifdef GC_STATS - PRInt32 bin; - PRInt64 allocTime; -#endif -#ifdef GC_TRACEROOTS - PRInt32 traceGeneration; -#endif -} GCBlockEnd; - -#define PR_BLOCK_END 0xDEADBEEF - -/************************************************************************/ - -#ifdef GC_STATS - -typedef struct GCStat { - PRInt32 nallocs; - double allocTime; - double allocTimeVariance; - PRInt32 nfrees; - double lifetime; - double lifetimeVariance; -} GCStat; - -#define GCSTAT_BINS NUM_BINS - -GCStat gcstats[GCSTAT_BINS]; - -#define GCLTFREQ_BINS NUM_BINS - -PRInt32 gcltfreq[GCSTAT_BINS][GCLTFREQ_BINS]; - -#include - -static char* -pr_GetSizeString(PRUint32 size) -{ - char* sizeStr; - if (size < 1024) - sizeStr = PR_smprintf("<= %ld", size); - else if (size < 1024 * 1024) - sizeStr = PR_smprintf("<= %ldk", size / 1024); - else - sizeStr = PR_smprintf("<= %ldM", size / (1024 * 1024)); - return sizeStr; -} - -static void -pr_FreeSizeString(char *sizestr) -{ - PR_smprintf_free(sizestr); -} - - -static void -pr_PrintGCAllocStats(FILE* out) -{ - PRInt32 i, j; - _PR_DebugPrint(out, "\n--Allocation-Stats-----------------------------------------------------------"); - _PR_DebugPrint(out, "\n--Obj-Size----Count-----Avg-Alloc-Time-----------Avg-Lifetime---------%%Freed-\n"); - for (i = 0; i < GCSTAT_BINS; i++) { - GCStat stat = gcstats[i]; - double allocTimeMean = 0.0, allocTimeVariance = 0.0, lifetimeMean = 0.0, lifetimeVariance = 0.0; - PRUint32 maxSize = (1 << i); - char* sizeStr; - if (stat.nallocs != 0.0) { - allocTimeMean = stat.allocTime / stat.nallocs; - allocTimeVariance = fabs(stat.allocTimeVariance / stat.nallocs - allocTimeMean * allocTimeMean); - } - if (stat.nfrees != 0.0) { - lifetimeMean = stat.lifetime / stat.nfrees; - lifetimeVariance = fabs(stat.lifetimeVariance / stat.nfrees - lifetimeMean * lifetimeMean); - } - sizeStr = pr_GetSizeString(maxSize); - _PR_DebugPrint(out, "%10s %8lu %10.3f +- %10.3f %10.3f +- %10.3f (%2ld%%)\n", - sizeStr, stat.nallocs, - allocTimeMean, sqrt(allocTimeVariance), - lifetimeMean, sqrt(lifetimeVariance), - (stat.nallocs ? (stat.nfrees * 100 / stat.nallocs) : 0)); - pr_FreeSizeString(sizeStr); - } - _PR_DebugPrint(out, "--Lifetime-Frequency-Counts----------------------------------------------------\n"); - _PR_DebugPrint(out, "size\\cnt"); - for (j = 0; j < GCLTFREQ_BINS; j++) { - _PR_DebugPrint(out, "\t%lu", j); - } - _PR_DebugPrint(out, "\n"); - for (i = 0; i < GCSTAT_BINS; i++) { - PRInt32* freqs = gcltfreq[i]; - _PR_DebugPrint(out, "%lu", (1 << i)); - for (j = 0; j < GCLTFREQ_BINS; j++) { - _PR_DebugPrint(out, "\t%lu", freqs[j]); - } - _PR_DebugPrint(out, "\n"); - } - _PR_DebugPrint(out, "-------------------------------------------------------------------------------\n"); -} - -PR_PUBLIC_API(void) -PR_PrintGCAllocStats(void) -{ - pr_PrintGCAllocStats(stderr); -} - -#endif /* GC_STATS */ - -/************************************************************************/ - -/* -** Sweep a segment, cleaning up all of the debris. Coallese the debris -** into GCFreeChunk's which are added to the freelist bins. -*/ -static PRBool SweepSegment(GCSeg *sp) -{ - PRWord h, tix; - PRWord *p; - PRWord *np; - PRWord *limit; - GCFreeChunk *cp; - PRInt32 bytes, chunkSize, segmentSize, totalFree; - CollectorType *ct; - PRInt32 bin; - - /* - ** Now scan over the segment's memory in memory order, coallescing - ** all of the debris into a FreeChunk list. - */ - totalFree = 0; - segmentSize = sp->limit - sp->base; - p = (PRWord *) sp->base; - limit = (PRWord *) sp->limit; - PR_ASSERT(segmentSize > 0); - while (p < limit) { - chunkSize = 0; - cp = (GCFreeChunk *) p; - - /* Attempt to coallesce any neighboring free objects */ - for (;;) { - PR_ASSERT(IS_HBIT(sp, p) != 0); - h = p[0]; - bytes = OBJ_BYTES(h); - PR_ASSERT(bytes != 0); - np = (PRWord *) ((char *)p + bytes); - tix = (PRWord)GET_TYPEIX(h); - if ((h & MARK_BIT) && (tix != FREE_MEMORY_TYPEIX)) { -#ifdef DEBUG - if (tix != FREE_MEMORY_TYPEIX) { - PR_ASSERT(_pr_collectorTypes[tix].flags != 0); - } -#endif - p[0] = h & ~(MARK_BIT|FINAL_BIT); - _GCTRACE(GC_SWEEP, ("busy 0x%x (%d)", p, bytes)); - break; - } - _GCTRACE(GC_SWEEP, ("free 0x%x (%d)", p, bytes)); - - /* Found a free object */ -#ifdef GC_STATS - { - PRInt32 userSize = bytes - sizeof(GCBlockEnd); - GCBlockEnd* end = (GCBlockEnd*)((char*)p + userSize); - if (userSize >= 0 && end->check == PR_BLOCK_END) { - PRInt64 now = PR_Now(); - double nowd, delta; - PRInt32 freq; - LL_L2D(nowd, now); - delta = nowd - end->allocTime; - gcstats[end->bin].nfrees++; - gcstats[end->bin].lifetime += delta; - gcstats[end->bin].lifetimeVariance += delta * delta; - - InlineBinNumber(freq, delta); - gcltfreq[end->bin][freq]++; - - end->check = 0; - } - } -#endif - CLEAR_HBIT(sp, p); - ct = &_pr_collectorTypes[tix]; - if (0 != ct->gctype.free) { - (*ct->gctype.free)(p + 1); - } - chunkSize = chunkSize + bytes; - if (np == limit) { - /* Found the end of heap */ - break; - } - PR_ASSERT(np < limit); - p = np; - } - - if (chunkSize) { - _GCTRACE(GC_SWEEP, ("free chunk 0x%p to 0x%p (%d)", - cp, (char*)cp + chunkSize - 1, chunkSize)); - if (chunkSize < MIN_FREE_CHUNK_BYTES) { - /* Lost a tiny fragment until (maybe) next time */ - METER(meter.wastedBytes += chunkSize); - p = (PRWord *) cp; - chunkSize >>= BYTES_PER_WORD_LOG2; - PR_ASSERT(chunkSize != 0); - p[0] = MAKE_HEADER(FREE_MEMORY_TYPEIX, chunkSize); - SET_HBIT(sp, p); - } else { - /* See if the chunk constitutes the entire segment */ - if (chunkSize == segmentSize) { - /* Free up the segment right now */ - if (sp->info->fromMalloc) { - ShrinkGCHeap(sp); - return PR_TRUE; - } - } - - /* Put free chunk into the appropriate bin */ - cp->segment = sp; - cp->chunkSize = chunkSize; - InlineBinNumber(bin, chunkSize) - cp->next = bins[bin]; - bins[bin] = cp; - if (bin < minBin) minBin = bin; - if (bin > maxBin) maxBin = bin; - - /* Zero swept memory now */ - memset(cp+1, 0, chunkSize - sizeof(*cp)); - METER(meter.numFreeChunks++); - totalFree += chunkSize; - } - } - - /* Advance to next object */ - p = np; - } - - PR_ASSERT(totalFree <= segmentSize); - - _pr_gcData.freeMemory += totalFree; - _pr_gcData.busyMemory += (sp->limit - sp->base) - totalFree; - return PR_FALSE; -} - -/************************************************************************/ - -/* This is a list of all the objects that are finalizable. This is not - the list of objects that are awaiting finalization because they - have been collected. */ -PRCList _pr_finalizeableObjects; - -/* This is the list of objects that are awaiting finalization because - they have been collected. */ -PRCList _pr_finalQueue; - -/* Each object that requires finalization has one of these objects - allocated as well. The GCFinal objects are put on the - _pr_finalizeableObjects list until the object is collected at which - point the GCFinal object is moved to the _pr_finalQueue */ -typedef struct GCFinalStr { - PRCList links; - PRWord *object; -} GCFinal; - -/* Find pointer to GCFinal struct from the list linkaged embedded in it */ -#define FinalPtr(_qp) \ - ((GCFinal*) ((char*) (_qp) - offsetof(GCFinal,links))) - -static GCFinal *AllocFinalNode(void) -{ - return PR_NEWZAP(GCFinal); -} - -static void FreeFinalNode(GCFinal *node) -{ - PR_DELETE(node); -} - -/* -** Prepare for finalization. At this point in the GC cycle we have -** identified all of the live objects. For each object on the -** _pr_finalizeableObjects list see if the object is alive or dead. If -** it's dead, resurrect it and move it from the _pr_finalizeableObjects -** list to the _pr_finalQueue (object's only get finalized once). -** -** Once _pr_finalizeableObjects has been processed we can finish the -** GC and free up memory and release the threading lock. After that we -** can invoke the finalization procs for each object that is on the -** _pr_finalQueue. -*/ -static void PrepareFinalize(void) -{ - PRCList *qp; - GCFinal *fp; - PRWord h; - PRWord *p; - void (PR_CALLBACK *livePointer)(void *ptr); -#ifdef DEBUG - CollectorType *ct; -#endif - - /* This must be done under the same lock that the finalizer uses */ - PR_ASSERT( GC_IS_LOCKED() ); - - /* cache this ptr */ - livePointer = _pr_gcData.livePointer; - - /* - * Pass #1: Identify objects that are to be finalized, set their - * FINAL_BIT. - */ - qp = _pr_finalizeableObjects.next; - while (qp != &_pr_finalizeableObjects) { - fp = FinalPtr(qp); - qp = qp->next; - h = fp->object[0]; /* Grab header word */ - if (h & MARK_BIT) { - /* Object is already alive */ - continue; - } - -#ifdef DEBUG - ct = &_pr_collectorTypes[GET_TYPEIX(h)]; - PR_ASSERT((0 != ct->flags) && (0 != ct->gctype.finalize)); -#endif - fp->object[0] |= FINAL_BIT; - _GCTRACE(GC_FINAL, ("moving %p (%d) to finalQueue", - fp->object, OBJ_BYTES(h))); - } - - /* - * Pass #2: For each object that is going to be finalized, move it to - * the finalization queue and resurrect it - */ - qp = _pr_finalizeableObjects.next; - while (qp != &_pr_finalizeableObjects) { - fp = FinalPtr(qp); - qp = qp->next; - h = fp->object[0]; /* Grab header word */ - if ((h & FINAL_BIT) == 0) { - continue; - } - - /* Resurrect the object and any objects it refers to */ - p = &fp->object[1]; - (*livePointer)(p); - PR_REMOVE_LINK(&fp->links); - PR_APPEND_LINK(&fp->links, &_pr_finalQueue); - } -} - -/* -** Scan the finalQ, marking each and every object on it live. This is -** necessary because we might do a GC before objects that are on the -** final queue get finalized. Since there are no other references -** (otherwise they would be on the final queue), we have to scan them. -** This really only does work if we call the GC before the finalizer -** has a chance to do its job. -*/ -extern void PR_CALLBACK _PR_ScanFinalQueue(void *notused) -{ - PRCList *qp; - GCFinal *fp; - PRWord *p; - void ( PR_CALLBACK *livePointer)(void *ptr); - - livePointer = _pr_gcData.livePointer; - qp = _pr_finalQueue.next; - while (qp != &_pr_finalQueue) { - fp = FinalPtr(qp); - _GCTRACE(GC_FINAL, ("marking 0x%x (on final queue)", fp->object)); - p = &fp->object[1]; - (*livePointer)(p); - qp = qp->next; - } -} - -void PR_CALLBACK FinalizerLoop(void* unused) -{ - GCFinal *fp; - PRWord *p; - PRWord h, tix; - CollectorType *ct; - - LOCK_GC(); - for (;;) { - p = 0; h = 0; /* don't let the gc find these pointers */ - while (PR_CLIST_IS_EMPTY(&_pr_finalQueue)) - PR_Wait(_pr_gcData.lock, PR_INTERVAL_NO_TIMEOUT); - - _GCTRACE(GC_FINAL, ("begin finalization")); - while (_pr_finalQueue.next != &_pr_finalQueue) { - fp = FinalPtr(_pr_finalQueue.next); - PR_REMOVE_LINK(&fp->links); - p = fp->object; - - h = p[0]; /* Grab header word */ - tix = (PRWord)GET_TYPEIX(h); - ct = &_pr_collectorTypes[tix]; - _GCTRACE(GC_FINAL, ("finalize 0x%x (%d)", p, OBJ_BYTES(h))); - - /* - ** Give up the GC lock so that other threads can allocate memory - ** while this finalization method is running. Get it back - ** afterwards so that the list remains thread safe. - */ - UNLOCK_GC(); - FreeFinalNode(fp); - PR_ASSERT(ct->gctype.finalize != 0); - (*ct->gctype.finalize)(p + 1); - LOCK_GC(); - } - _GCTRACE(GC_FINAL, ("end finalization")); - PR_Notify(_pr_gcData.lock); - } -} - -static void NotifyFinalizer(void) -{ - if (!PR_CLIST_IS_EMPTY(&_pr_finalQueue)) { - PR_ASSERT( GC_IS_LOCKED() ); - PR_Notify(_pr_gcData.lock); - } -} - -void _PR_CreateFinalizer(PRThreadScope scope) -{ - if (!_pr_gcData.finalizer) { - _pr_gcData.finalizer = PR_CreateThreadGCAble(PR_SYSTEM_THREAD, - FinalizerLoop, 0, - PR_PRIORITY_LOW, scope, - PR_UNJOINABLE_THREAD, 0); - - if (_pr_gcData.finalizer == NULL) - /* We are doomed if we can't start the finalizer */ - PR_Abort(); - - } -} - -void pr_FinalizeOnExit(void) -{ -#ifdef DEBUG_warren - OutputDebugString("### Doing finalize-on-exit pass\n"); -#endif - PR_ForceFinalize(); -#ifdef DEBUG_warren - OutputDebugString("### Finalize-on-exit complete. Dumping object left to memory.out\n"); - PR_DumpMemorySummary(); - PR_DumpMemory(PR_TRUE); -#endif -} - -PR_IMPLEMENT(void) PR_ForceFinalize() -{ - LOCK_GC(); - NotifyFinalizer(); - while (!PR_CLIST_IS_EMPTY(&_pr_finalQueue)) { - PR_ASSERT( GC_IS_LOCKED() ); - (void) PR_Wait(_pr_gcData.lock, PR_INTERVAL_NO_TIMEOUT); - } - UNLOCK_GC(); - - /* XXX I don't know how to make it wait (yet) */ -} - -/************************************************************************/ - -typedef struct GCWeakStr { - PRCList links; - PRWord *object; -} GCWeak; - -/* -** Find pointer to GCWeak struct from the list linkaged embedded in it -*/ -#define WeakPtr(_qp) \ - ((GCWeak*) ((char*) (_qp) - offsetof(GCWeak,links))) - -PRCList _pr_weakLinks = PR_INIT_STATIC_CLIST(&_pr_weakLinks); -PRCList _pr_freeWeakLinks = PR_INIT_STATIC_CLIST(&_pr_freeWeakLinks); - -#define WEAK_FREELIST_ISEMPTY() (_pr_freeWeakLinks.next == &_pr_freeWeakLinks) - -/* - * Keep objects referred to by weak free list alive until they can be - * freed - */ -static void PR_CALLBACK ScanWeakFreeList(void *notused) { - PRCList *qp = _pr_freeWeakLinks.next; - while (qp != &_pr_freeWeakLinks) { - GCWeak *wp = WeakPtr(qp); - qp = qp->next; - ProcessRootPointer(wp->object); - } -} - -/* - * Empty the list of weak objects. Note that we can't call malloc/free - * under the cover of the GC's lock (we might deadlock), so transfer the - * list of free objects to a local list under the cover of the lock, then - * release the lock and free up the memory. - */ -static void EmptyWeakFreeList(void) { - if (!WEAK_FREELIST_ISEMPTY()) { - PRCList *qp, freeLinks; - - PR_INIT_CLIST(&freeLinks); - - /* - * Transfer list of free weak links from the global list to a - * local list. - */ - LOCK_GC(); - qp = _pr_freeWeakLinks.next; - while (qp != &_pr_freeWeakLinks) { - GCWeak *wp = WeakPtr(qp); - qp = qp->next; - PR_REMOVE_LINK(&wp->links); - PR_APPEND_LINK(&wp->links, &freeLinks); - } - UNLOCK_GC(); - - /* Free up storage now */ - qp = freeLinks.next; - while (qp != &freeLinks) { - GCWeak *wp = WeakPtr(qp); - qp = qp->next; - PR_DELETE(wp); - } - } -} - -/* - * Allocate a new weak node in the weak objects list - */ -static GCWeak *AllocWeakNode(void) -{ - EmptyWeakFreeList(); - return PR_NEWZAP(GCWeak); -} - -static void FreeWeakNode(GCWeak *node) -{ - PR_DELETE(node); -} - -/* - * Check the weak links for validity. Note that the list of weak links is - * itself weak (otherwise we would keep the objects with weak links in - * them alive forever). As we scan the list check the weak link object - * itself and if it's not marked then remove it from the weak link list - */ -static void CheckWeakLinks(void) { - PRCList *qp; - GCWeak *wp; - PRWord *p, h, tix, **weakPtrAddress; - CollectorType *ct; - PRUint32 offset; - - qp = _pr_weakLinks.next; - while (qp != &_pr_weakLinks) { - wp = WeakPtr(qp); - qp = qp->next; - if ((p = wp->object) != 0) { - h = p[0]; /* Grab header word */ - if ((h & MARK_BIT) == 0) { - /* - * The object that has a weak link is no longer being - * referenced; remove it from the chain and let it get - * swept away by the GC. Transfer it to the list of - * free weak links for later freeing. - */ - PR_REMOVE_LINK(&wp->links); - PR_APPEND_LINK(&wp->links, &_pr_freeWeakLinks); - collectorCleanupNeeded = 1; - continue; - } - - /* Examine a live object that contains weak links */ - tix = GET_TYPEIX(h); - ct = &_pr_collectorTypes[tix]; - PR_ASSERT((ct->flags != 0) && (ct->gctype.getWeakLinkOffset != 0)); - if (0 == ct->gctype.getWeakLinkOffset) { - /* Heap is probably corrupted */ - continue; - } - - /* Get offset into the object of where the weak pointer is */ - offset = (*ct->gctype.getWeakLinkOffset)(p + 1); - - /* Check the weak pointer */ - weakPtrAddress = (PRWord**)((char*)(p + 1) + offset); - p = *weakPtrAddress; - if (p != 0) { - h = p[-1]; /* Grab header word for pointed to object */ - if (h & MARK_BIT) { - /* Object can't be dead */ - continue; - } - /* Break weak link to an object that is about to be swept */ - *weakPtrAddress = 0; - } - } - } -} - -/************************************************************************/ - -/* -** Perform a complete garbage collection -*/ - -extern GCLockHook *_pr_GCLockHook; - -static void dogc(void) -{ - RootFinder *rf; - GCLockHook* lhook; - - GCScanQ scanQ; - GCSeg *sp, *esp; - PRInt64 start, end, diff; - -#if defined(GCMETER) || defined(GCTIMINGHOOK) - start = PR_Now(); -#endif - - /* - ** Stop all of the other threads. This also promises to capture the - ** register state of each and every thread - */ - - /* - ** Get all the locks that will be need during GC after SuspendAll. We - ** cannot make any locking/library calls after SuspendAll. - */ - if (_pr_GCLockHook) { - for (lhook = _pr_GCLockHook->next; lhook != _pr_GCLockHook; - lhook = lhook->next) { - (*lhook->func)(PR_GCBEGIN, lhook->arg); - } - } - - PR_SuspendAll(); - -#ifdef GCMETER - /* Reset meter info */ - if (_pr_gcMeter & _GC_METER_STATS) { - fprintf(stderr, - "[GCSTATS: busy:%ld skipped:%ld, alloced:%ld+wasted:%ld+free:%ld = total:%ld]\n", - (long) _pr_gcData.busyMemory, - (long) meter.skippedFreeChunks, - (long) meter.allocBytes, - (long) meter.wastedBytes, - (long) _pr_gcData.freeMemory, - (long) _pr_gcData.allocMemory); - } - memset(&meter, 0, sizeof(meter)); -#endif - - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("begin mark phase; busy=%d free=%d total=%d", - _pr_gcData.busyMemory, _pr_gcData.freeMemory, - _pr_gcData.allocMemory)); - - if (_pr_beginGCHook) { - (*_pr_beginGCHook)(_pr_beginGCHookArg); - } - - /* - ** Initialize scanQ to all zero's so that root finder doesn't walk - ** over it... - */ - memset(&scanQ, 0, sizeof(scanQ)); - pScanQ = &scanQ; - - /******************************************/ - /* MARK PHASE */ - - EmptyFreelists(); - - /* Find root's */ - PR_LOG(_pr_msgc_lm, PR_LOG_WARNING, - ("begin mark phase; busy=%d free=%d total=%d", - _pr_gcData.busyMemory, _pr_gcData.freeMemory, - _pr_gcData.allocMemory)); - METER(_pr_scanDepth = 0); - rf = _pr_rootFinders; - while (rf) { - _GCTRACE(GC_ROOTS, ("finding roots in %s", rf->name)); - (*rf->func)(rf->arg); - rf = rf->next; - } - _GCTRACE(GC_ROOTS, ("done finding roots")); - - /* Scan remaining object's that need scanning */ - ScanScanQ(&scanQ); - PR_ASSERT(pScanQ == &scanQ); - PR_ASSERT(scanQ.queued == 0); - METER({ - if (_pr_scanDepth > _pr_maxScanDepth) { - _pr_maxScanDepth = _pr_scanDepth; - } - }); - - /******************************************/ - /* FINALIZATION PHASE */ - - METER(_pr_scanDepth = 0); - PrepareFinalize(); - - /* Scan any resurrected objects found during finalization */ - ScanScanQ(&scanQ); - PR_ASSERT(pScanQ == &scanQ); - PR_ASSERT(scanQ.queued == 0); - METER({ - if (_pr_scanDepth > _pr_maxScanDepth) { - _pr_maxScanDepth = _pr_scanDepth; - } - }); - pScanQ = 0; - - /******************************************/ - /* SWEEP PHASE */ - - /* - ** Sweep each segment clean. While we are at it, figure out which - ** segment has the most free space and make that the current segment. - */ - CheckWeakLinks(); - _GCTRACE(GC_SWEEP, ("begin sweep phase")); - _pr_gcData.freeMemory = 0; - _pr_gcData.busyMemory = 0; - sp = segs; - esp = sp + nsegs; - while (sp < esp) { - if (SweepSegment(sp)) { - /* - ** Segment is now free and has been replaced with a different - ** segment object. - */ - esp--; - continue; - } - sp++; - } - -#if defined(GCMETER) || defined(GCTIMINGHOOK) - end = PR_Now(); -#endif -#ifdef GCMETER - LL_SUB(diff, end, start); - PR_LOG(GC, PR_LOG_ALWAYS, - ("done; busy=%d free=%d chunks=%d total=%d time=%lldms", - _pr_gcData.busyMemory, _pr_gcData.freeMemory, - meter.numFreeChunks, _pr_gcData.allocMemory, diff)); - if (_pr_gcMeter & _GC_METER_FREE_LIST) { - PRIntn bin; - fprintf(stderr, "Freelist bins:\n"); - for (bin = 0; bin < NUM_BINS; bin++) { - GCFreeChunk *cp = bins[bin]; - while (cp != NULL) { - fprintf(stderr, "%3d: %p %8ld\n", - bin, cp, (long) cp->chunkSize); - cp = cp->next; - } - } - } -#endif - - if (_pr_endGCHook) { - (*_pr_endGCHook)(_pr_endGCHookArg); - } - - /* clear the running total of the bytes allocated via BigAlloc() */ - bigAllocBytes = 0; - - /* And resume multi-threading */ - PR_ResumeAll(); - - if (_pr_GCLockHook) { - for (lhook = _pr_GCLockHook->prev; lhook != _pr_GCLockHook; - lhook = lhook->prev) { - (*lhook->func)(PR_GCEND, lhook->arg); - } - } - - /* Kick finalizer */ - NotifyFinalizer(); -#ifdef GCTIMINGHOOK - if (_pr_gcData.gcTimingHook) { - PRInt32 time; - LL_SUB(diff, end, start); - LL_L2I(time, diff); - _pr_gcData.gcTimingHook(time); - } -#endif -} - -PR_IMPLEMENT(void) PR_GC(void) -{ - LOCK_GC(); - dogc(); - UNLOCK_GC(); - - EmptyWeakFreeList(); -} - -/******************************************************************************* - * Heap Walker - ******************************************************************************/ - -/* -** This is yet another disgusting copy of the body of ProcessRootPointer -** (the other being ProcessRootBlock), but we're not leveraging a single -** function in their cases in interest of performance (avoiding the function -** call). -*/ -static PRInt32 PR_CALLBACK -pr_ConservativeWalkPointer(void* ptr, PRWalkFun walkRootPointer, void* data) -{ - PRWord *p0, *p, *segBase; - GCSeg* sp; - - p0 = (PRWord*) ptr; - - if (p0 < _pr_gcData.lowSeg) return 0; /* below gc heap */ - if (p0 >= _pr_gcData.highSeg) return 0; /* above gc heap */ - - /* NOTE: inline expansion of InHeap */ - /* Find segment */ - sp = lastInHeap; - if (!sp || !IN_SEGMENT(sp,p0)) { - GCSeg *esp; - sp = segs; - esp = segs + nsegs; - for (; sp < esp; sp++) { - if (IN_SEGMENT(sp, p0)) { - lastInHeap = sp; - goto find_object; - } - } - return 0; - } - - find_object: - /* NOTE: Inline expansion of FindObject */ - /* Align p to it's proper boundary before we start fiddling with it */ - p = (PRWord*) ((PRWord)p0 & ~(BYTES_PER_WORD-1L)); - segBase = (PRWord *) sp->base; - do { - if (IS_HBIT(sp, p)) { - goto winner; - } - p--; - } while (p >= segBase); - - /* - ** We have a pointer into the heap, but it has no header - ** bit. This means that somehow the very first object in the heap - ** doesn't have a header. This is impossible so when debugging - ** lets abort. - */ -#ifdef DEBUG - PR_Abort(); -#endif - return 0; - - winner: - return walkRootPointer(p, data); -} - -static PRInt32 PR_CALLBACK -pr_ConservativeWalkBlock(void **base, PRInt32 count, - PRWalkFun walkRootPointer, void* data) -{ - PRWord *p0; - while (--count >= 0) { - PRInt32 status; - p0 = (PRWord*) *base++; - status = pr_ConservativeWalkPointer(p0, walkRootPointer, data); - if (status) return status; - } - return 0; -} - -/******************************************************************************/ - -typedef void (*WalkObject_t)(FILE *out, GCType* tp, PRWord *obj, - size_t bytes, PRBool detailed); -typedef void (*WalkUnknown_t)(FILE *out, GCType* tp, PRWord tix, PRWord *p, - size_t bytes, PRBool detailed); -typedef void (*WalkFree_t)(FILE *out, PRWord *p, size_t size, PRBool detailed); -typedef void (*WalkSegment_t)(FILE *out, GCSeg* sp, PRBool detailed); - -static void -pr_WalkSegment(FILE* out, GCSeg* sp, PRBool detailed, - char* enterMsg, char* exitMsg, - WalkObject_t walkObject, WalkUnknown_t walkUnknown, WalkFree_t walkFree) -{ - PRWord *p, *limit; - - p = (PRWord *) sp->base; - limit = (PRWord *) sp->limit; - if (enterMsg) - fprintf(out, enterMsg, p); - while (p < limit) - { - if (IS_HBIT(sp, p)) /* Is this an object header? */ - { - PRWord h = p[0]; - PRWord tix = GET_TYPEIX(h); - size_t bytes = OBJ_BYTES(h); - PRWord* np = (PRWord*) ((char*)p + bytes); - - GCType* tp = &_pr_collectorTypes[tix].gctype; - if ((0 != tp) && walkObject) - walkObject(out, tp, p, bytes, detailed); - else if (walkUnknown) - walkUnknown(out, tp, tix, p, bytes, detailed); - p = np; - } - else - { - /* Must be a freelist item */ - size_t size = ((GCFreeChunk*)p)->chunkSize; - if (walkFree) - walkFree(out, p, size, detailed); - p = (PRWord*)((char*)p + size); - } - } - if (p != limit) - fprintf(out, "SEGMENT OVERRUN (end should be at 0x%p)\n", limit); - if (exitMsg) - fprintf(out, exitMsg, p); -} - -static void -pr_WalkSegments(FILE *out, WalkSegment_t walkSegment, PRBool detailed) -{ - GCSeg *sp = segs; - GCSeg *esp; - - LOCK_GC(); - esp = sp + nsegs; - while (sp < esp) - { - walkSegment(out, sp, detailed); - sp++; - } - fprintf(out, "End of heap\n"); - UNLOCK_GC(); -} - -/******************************************************************************* - * Heap Dumper - ******************************************************************************/ - -PR_IMPLEMENT(void) -PR_DumpIndent(FILE *out, int indent) -{ - while (--indent >= 0) - fprintf(out, " "); -} - -static void -PR_DumpHexWords(FILE *out, PRWord *p, int nWords, - int indent, int nWordsPerLine) -{ - while (nWords > 0) - { - int i; - - PR_DumpIndent(out, indent); - i = nWordsPerLine; - if (i > nWords) - i = nWords; - nWords -= i; - while (i--) - { - fprintf(out, "0x%.8lX", (long) *p++); - if (i) - fputc(' ', out); - } - fputc('\n', out); - } -} - -static void PR_CALLBACK -pr_DumpObject(FILE *out, GCType* tp, PRWord *p, - size_t bytes, PRBool detailed) -{ - char kindChar = tp->kindChar; - fprintf(out, "0x%p: 0x%.6lX %c ", - p, (long) bytes, kindChar ? kindChar : '?'); - if (tp->dump) - (*tp->dump)(out, (void*) (p + 1), detailed, 0); - if (detailed) - PR_DumpHexWords(out, p, bytes>>2, 22, 4); -} - -static void PR_CALLBACK -pr_DumpUnknown(FILE *out, GCType* tp, PRWord tix, PRWord *p, - size_t bytes, PRBool detailed) -{ - char kindChar = tp->kindChar; - fprintf(out, "0x%p: 0x%.6lX %c ", - p, (long) bytes, kindChar ? kindChar : '?'); - fprintf(out, "UNKNOWN KIND %ld\n", (long) tix); - if (detailed) - PR_DumpHexWords(out, p, bytes>>2, 22, 4); -} - -static void PR_CALLBACK -pr_DumpFree(FILE *out, PRWord *p, size_t size, PRBool detailed) -{ - fprintf(out, "0x%p: 0x%.6lX - FREE\n", p, (long) size); -} - -static void PR_CALLBACK -pr_DumpSegment(FILE* out, GCSeg* sp, PRBool detailed) -{ - pr_WalkSegment(out, sp, detailed, - "\n Address: Length\n0x%p: Beginning of segment\n", - "0x%p: End of segment\n\n", - pr_DumpObject, pr_DumpUnknown, pr_DumpFree); -} - -static void pr_DumpRoots(FILE *out); - -/* -** Dump out the GC heap. -*/ -PR_IMPLEMENT(void) -PR_DumpGCHeap(FILE *out, PRBool detailed) -{ - fprintf(out, "\n" - "The kinds are:\n" - " U unscanned block\n" - " W weak link block\n" - " S scanned block\n" - " F scanned and final block\n" - " C class record\n" - " X context record\n" - " - free list item\n" - " ? other\n"); - LOCK_GC(); - pr_WalkSegments(out, pr_DumpSegment, detailed); - if (detailed) - pr_DumpRoots(out); - UNLOCK_GC(); -} - -PR_IMPLEMENT(void) -PR_DumpMemory(PRBool detailed) -{ - PR_DumpToFile("memory.out", "Dumping memory", PR_DumpGCHeap, detailed); -} - -/******************************************************************************/ - -static PRInt32 PR_CALLBACK -pr_DumpRootPointer(PRWord* p, void* data) -{ - PRWord h = p[0]; - PRWord tix = GET_TYPEIX(h); - size_t bytes = OBJ_BYTES(h); - - GCType* tp = &_pr_collectorTypes[tix].gctype; - if (0 != tp) - pr_DumpObject(_pr_gcData.dumpOutput, tp, p, bytes, PR_FALSE); - else - pr_DumpUnknown(_pr_gcData.dumpOutput, tp, tix, p, bytes, PR_FALSE); - return 0; -} - -static void PR_CALLBACK -pr_ConservativeDumpRootPointer(void* ptr) -{ - (void)pr_ConservativeWalkPointer(ptr, (PRWalkFun) pr_DumpRootPointer, NULL); -} - -static void PR_CALLBACK -pr_ConservativeDumpRootBlock(void **base, PRInt32 count) -{ - (void)pr_ConservativeWalkBlock(base, count, (PRWalkFun) pr_DumpRootPointer, NULL); -} - -extern int -DumpThreadRoots(PRThread *t, int i, void *notused); - -static void -pr_DumpRoots(FILE *out) -{ - RootFinder *rf; - void (*liveBlock)(void **base, PRInt32 count); - void (*livePointer)(void *ptr); - void (*processRootBlock)(void **base, PRInt32 count); - void (*processRootPointer)(void *ptr); - - LOCK_GC(); - - liveBlock = _pr_gcData.liveBlock; - livePointer = _pr_gcData.livePointer; - processRootBlock = _pr_gcData.processRootBlock; - processRootPointer = _pr_gcData.processRootPointer; - - _pr_gcData.liveBlock = pr_ConservativeDumpRootBlock; - _pr_gcData.livePointer = pr_ConservativeDumpRootPointer; - _pr_gcData.processRootBlock = pr_ConservativeDumpRootBlock; - _pr_gcData.processRootPointer = pr_ConservativeDumpRootPointer; - _pr_gcData.dumpOutput = out; - - rf = _pr_rootFinders; - while (rf) { - fprintf(out, "\n===== Roots for %s\n", rf->name); - (*rf->func)(rf->arg); - rf = rf->next; - } - - _pr_gcData.liveBlock = liveBlock; - _pr_gcData.livePointer = livePointer; - _pr_gcData.processRootBlock = processRootBlock; - _pr_gcData.processRootPointer = processRootPointer; - _pr_gcData.dumpOutput = NULL; - - UNLOCK_GC(); -} - -/******************************************************************************* - * Heap Summary Dumper - ******************************************************************************/ - -PRSummaryPrinter summaryPrinter = NULL; -void* summaryPrinterClosure = NULL; - -PR_IMPLEMENT(void) -PR_RegisterSummaryPrinter(PRSummaryPrinter fun, void* closure) -{ - summaryPrinter = fun; - summaryPrinterClosure = closure; -} - -static void PR_CALLBACK -pr_SummarizeObject(FILE *out, GCType* tp, PRWord *p, - size_t bytes, PRBool detailed) -{ - if (tp->summarize) - (*tp->summarize)((void GCPTR*)(p + 1), bytes); -} - -static void PR_CALLBACK -pr_DumpSummary(FILE* out, GCSeg* sp, PRBool detailed) -{ - pr_WalkSegment(out, sp, detailed, NULL, NULL, - pr_SummarizeObject, NULL, NULL); -} - -PR_IMPLEMENT(void) -PR_DumpGCSummary(FILE *out, PRBool detailed) -{ - if (summaryPrinter) { - pr_WalkSegments(out, pr_DumpSummary, detailed); - summaryPrinter(out, summaryPrinterClosure); - } -#if 0 - fprintf(out, "\nFinalizable objects:\n"); - { - PRCList *qp; - qp = _pr_pendingFinalQueue.next; - while (qp != &_pr_pendingFinalQueue) { - GCFinal* fp = FinalPtr(qp); - PRWord h = fp->object[0]; /* Grab header word */ - PRWord tix = GET_TYPEIX(h); - GCType* tp = _pr_gcTypes[tix]; - size_t bytes = OBJ_BYTES(h); - pr_DumpObject(out, tp, fp->object, bytes, PR_FALSE); - qp = qp->next; - } - } -#endif -} - -PR_IMPLEMENT(void) -PR_DumpMemorySummary(void) -{ - PR_DumpToFile("memory.out", "Memory Summary", PR_DumpGCSummary, PR_FALSE); -} - -/******************************************************************************* - * End Of Heap Walker - ******************************************************************************/ - -#ifdef GC_TRACEROOTS - -PRInt32 pr_traceGen = 0; - -static PRBool -pr_IsMarked(PRWord* p) -{ - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - PR_ASSERT(end->check == PR_BLOCK_END); - return end->traceGeneration == pr_traceGen; -} - -static void -pr_Mark(PRWord* p) -{ - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - PR_ASSERT(end->check == PR_BLOCK_END); - end->traceGeneration = pr_traceGen; -} - -PRWord* pr_traceObj; /* set this in the debugger, then execute PR_TraceRoot() */ - -static PRInt32 PR_CALLBACK -pr_TraceRootObject(void* obj, void* data); - -static PRInt32 PR_CALLBACK -pr_TraceRootPointer(PRWord *p, void* data) -{ - PRInt32 printTrace = 0; - PRWord h = p[0]; - PRWord tix = GET_TYPEIX(h); - GCType* tp = &_pr_collectorTypes[tix].gctype; - FILE* out = _pr_gcData.dumpOutput; - - PR_ASSERT(tp); - if (pr_IsMarked(p)) - return printTrace; - - pr_Mark(p); - if (p == pr_traceObj) { - fprintf(out, "\n### Found path to:\n"); - printTrace = 1; - } - else { - if (PR_StackSpaceLeft(PR_GetCurrentThread()) < 512) { - fprintf(out, "\n### Path too deep (giving up):\n"); - printTrace = 1; - } - else if (tp->walk) { - printTrace = tp->walk((void*)(p + 1), pr_TraceRootObject, data); - } - /* else there's no way to walk this object, so we - haven't found what we're looking for */ - } - - if (printTrace == 1) { - PR_ASSERT(tp->dump); - fprintf(out, "0x%p: ", p); - tp->dump(out, (void*)(p + 1), PR_FALSE, 1); - } - return printTrace; -} - -static PRInt32 PR_CALLBACK -pr_TraceRootObject(void* obj, void* data) -{ - /* This version of pr_TraceRootPointer takes object - pointers, instead of gc header pointers. */ - return pr_TraceRootPointer((PRWord*)obj - 1, data); -} - -static void PR_CALLBACK -pr_ConservativeTraceRootPointer(PRWord *p) -{ - PRInt32 status; - ++pr_traceGen; - status = pr_ConservativeWalkPointer(p, pr_TraceRootPointer, NULL); - if (status) { - FILE* out = _pr_gcData.dumpOutput; - fprintf(out, "### from root at 0x%p\n\n", p); - } -} - -static void PR_CALLBACK -pr_ConservativeTraceRootBlock(void **base, PRInt32 count) -{ - PRInt32 status; - ++pr_traceGen; - status = pr_ConservativeWalkBlock(base, count, pr_TraceRootPointer, NULL); - if (status) { - FILE* out = _pr_gcData.dumpOutput; - fprintf(out, "### from root in range 0x%p + 0x%lx\n\n", - base, (long) count); - } -} - -static void -PR_TraceRoot1(FILE* out, PRBool detailed) -{ - RootFinder *rf; - void (*liveBlock)(void **base, PRInt32 count); - void (*livePointer)(void *ptr); - void (*processRootBlock)(void **base, PRInt32 count); - void (*processRootPointer)(void *ptr); - - LOCK_GC(); - - liveBlock = _pr_gcData.liveBlock; - livePointer = _pr_gcData.livePointer; - processRootBlock = _pr_gcData.processRootBlock; - processRootPointer = _pr_gcData.processRootPointer; - - _pr_gcData.liveBlock = pr_ConservativeTraceRootBlock; - _pr_gcData.livePointer = pr_ConservativeTraceRootPointer; - _pr_gcData.processRootBlock = pr_ConservativeTraceRootBlock; - _pr_gcData.processRootPointer = pr_ConservativeTraceRootPointer; - _pr_gcData.dumpOutput = out; - - fprintf(out, "### Looking for paths to 0x%p\n\n", pr_traceObj); - - rf = _pr_rootFinders; - while (rf) { - fprintf(out, "\n===== Roots for %s\n", rf->name); - (*rf->func)(rf->arg); - rf = rf->next; - } - - _pr_gcData.liveBlock = liveBlock; - _pr_gcData.livePointer = livePointer; - _pr_gcData.processRootBlock = processRootBlock; - _pr_gcData.processRootPointer = processRootPointer; - _pr_gcData.dumpOutput = NULL; - - UNLOCK_GC(); -} - -PR_PUBLIC_API(void) -PR_TraceRoot() -{ - /* - ** How this works: - ** Once you find the object you want to trace the roots of, set the - ** global variable pr_traceObj to point to it (the header, not the - ** java handle), and then call this routine (on Windows, you can set - ** a breakpoint at the end of a function that returns void (e.g. dogc) - ** and then do a "set next statement" to point to this routine and go. - ** This will dump a list of the paths from the roots to the object in - ** question to your memory.out file. - */ - PR_DumpToFile("memory.out", "Tracing Roots", PR_TraceRoot1, PR_FALSE); -} - -#endif /* GC_TRACEROOTS */ - -/******************************************************************************/ - -#if defined(DEBUG) && defined(WIN32) -static void DumpApplicationHeap(FILE *out, HANDLE heap) -{ - PROCESS_HEAP_ENTRY entry; - DWORD err; - - if (!HeapLock(heap)) - OutputDebugString("Can't lock the heap.\n"); - entry.lpData = 0; - fprintf(out, " address: size ovhd region\n"); - while (HeapWalk(heap, &entry)) - { - WORD flags = entry.wFlags; - - fprintf(out, "0x%.8X: 0x%.8X 0x%.2X 0x%.2X ", entry.lpData, entry.cbData, - entry.cbOverhead, entry.iRegionIndex); - if (flags & PROCESS_HEAP_REGION) - fprintf(out, "REGION committedSize=0x%.8X uncommittedSize=0x%.8X firstBlock=0x%.8X lastBlock=0x%.8X", - entry.Region.dwCommittedSize, entry.Region.dwUnCommittedSize, - entry.Region.lpFirstBlock, entry.Region.lpLastBlock); - else if (flags & PROCESS_HEAP_UNCOMMITTED_RANGE) - fprintf(out, "UNCOMMITTED"); - else if (flags & PROCESS_HEAP_ENTRY_BUSY) - { - if (flags & PROCESS_HEAP_ENTRY_DDESHARE) - fprintf(out, "DDEShare "); - if (flags & PROCESS_HEAP_ENTRY_MOVEABLE) - fprintf(out, "Moveable Block handle=0x%.8X", entry.Block.hMem); - else - fprintf(out, "Block"); - } - fprintf(out, "\n"); - } - if ((err = GetLastError()) != ERROR_NO_MORE_ITEMS) - fprintf(out, "ERROR %d iterating through the heap\n", err); - if (!HeapUnlock(heap)) - OutputDebugString("Can't unlock the heap.\n"); -} -#endif - -#if defined(DEBUG) && defined(WIN32) -static void DumpApplicationHeaps(FILE *out) -{ - HANDLE mainHeap; - HANDLE heaps[100]; - DWORD nHeaps; - PRInt32 i; - - mainHeap = GetProcessHeap(); - nHeaps = GetProcessHeaps(100, heaps); - if (nHeaps > 100) - nHeaps = 0; - fprintf(out, "%ld heaps:\n", (long) nHeaps); - for (i = 0; ichunkSize; - if (chunkSize < bytes) { - /* Too small; skip it */ - METER(meter.skippedFreeChunks++); - cpp = &cp->next; - continue; - } - - /* We have found a hunk of memory large enough to use */ - p = (PRWord*) cp; - sp = cp->segment; - cpNext = cp->next; -#ifndef IS_64 - if (dub && (((PRWord)p & (PR_BYTES_PER_DWORD-1)) == 0)) { - /* - * We are double aligning the memory and the current free - * chunk is aligned on an even boundary. Because header - * words are one word long we need to discard the first - * word of memory. - */ - p[0] = MAKE_HEADER(FREE_MEMORY_TYPEIX, 1); - SET_HBIT(sp, p); - p++; - chunkSize -= PR_BYTES_PER_WORD; - bytes -= PR_BYTES_PER_WORD; - PR_ASSERT(((PRWord)p & (PR_BYTES_PER_DWORD-1)) != 0); - _pr_gcData.freeMemory -= PR_BYTES_PER_WORD; - _pr_gcData.busyMemory += PR_BYTES_PER_WORD; - } -#endif - np = (PRWord*) ((char*) p + bytes); - remainder = chunkSize - bytes; - if (remainder >= MIN_FREE_CHUNK_BYTES) { - /* The left over memory is large enough to be freed. */ - cp = (GCFreeChunk*) np; - cp->segment = sp; - cp->chunkSize = remainder; - InlineBinNumber(newbin, remainder) - if (newbin != bin) { - *cpp = (GCFreeChunk*) cpNext; /* remove */ - cp->next = bins[newbin]; /* insert */ - bins[newbin] = cp; - if (newbin < minBin) minBin = newbin; - if (newbin > maxBin) maxBin = newbin; - } else { - /* Leave it on the same list */ - cp->next = cpNext; - *cpp = (GCFreeChunk*) np; - } - } else { - /* - * The left over memory is too small to be released. Just - * leave it attached to the chunk of memory being - * returned. - */ - *cpp = cpNext; - bytes = chunkSize; - } - p[0] = MAKE_HEADER(cbix, (bytes >> PR_BYTES_PER_WORD_LOG2)); - SET_HBIT(sp, p); - _pr_gcData.freeMemory -= bytes; - _pr_gcData.busyMemory += bytes; - return p; - } - } - return 0; -} - -/* -** Allocate a piece of memory that is "big" in it's own segment. Make -** the object consume the entire segment to avoid fragmentation. When -** the object is no longer referenced, the segment is freed. -*/ -static PRWord *BigAlloc(int cbix, PRInt32 bytes, int dub) -{ - GCSeg *sp; - PRWord *p, h; - PRInt32 chunkSize; - - /* - ** If the number of bytes allocated via BigAlloc() since the last GC - ** exceeds BIG_ALLOC_GC_SIZE then do a GC Now... - */ - if (bigAllocBytes >= BIG_ALLOC_GC_SIZE) { - dogc(); - } - bigAllocBytes += bytes; - - /* Get a segment to hold this allocation */ - sp = GrowHeapExactly(bytes); - - if (sp) { - p = (PRWord*) sp->base; - chunkSize = sp->limit - sp->base; - - /* All memory is double aligned on 64 bit machines... */ -#ifndef IS_64 - if (dub && (((PRWord)p & (PR_BYTES_PER_DWORD-1)) == 0)) { - /* - ** Consume the first word of the chunk with a dummy - ** unreferenced object. - */ - p[0] = MAKE_HEADER(FREE_MEMORY_TYPEIX, 1); - SET_HBIT(sp, p); - p++; - chunkSize -= PR_BYTES_PER_WORD; - _pr_gcData.freeMemory -= PR_BYTES_PER_WORD; - _pr_gcData.busyMemory += PR_BYTES_PER_WORD; - PR_ASSERT(((PRWord)p & (PR_BYTES_PER_DWORD-1)) != 0); - } -#endif - - /* Consume the *entire* segment with a single allocation */ - h = MAKE_HEADER(cbix, (chunkSize >> PR_BYTES_PER_WORD_LOG2)); - p[0] = h; - SET_HBIT(sp, p); - _pr_gcData.freeMemory -= chunkSize; - _pr_gcData.busyMemory += chunkSize; - return p; - } - return 0; -} - -/* we disable gc allocation during low memory conditions */ -static PRBool allocationEnabled = PR_TRUE; - -PR_IMPLEMENT(void) PR_EnableAllocation(PRBool yesOrNo) -{ - allocationEnabled = yesOrNo; -} - -static void CollectorCleanup(void) { - while (collectorCleanupNeeded) { - LOCK_GC(); - collectorCleanupNeeded = 0; - UNLOCK_GC(); - if (freeSegs) { - FreeSegments(); - } - if (!WEAK_FREELIST_ISEMPTY()) { - EmptyWeakFreeList(); - } - } -} - -/******************************************************************************/ - -#ifdef GC_CHECK -static PRInt32 allocationCount; - -static void EarthShatteringKaBoom(PRInt32 whichOne) { - long* p = 0; - *p = 0; -} - -/* Check a segment of heap memory. Verify that the object memory - hasn't been overwritten (past the end at least) */ -static void CheckSegment(GCSeg* sp) { - PRWord h, tix; - PRWord *p, *lastp, *np, *limit; - - lastp = p = (PRWord *) sp->base; - limit = (PRWord *) sp->limit; - while (p < limit) { - if (IS_HBIT(sp, p)) { - char *cp, i; - GCBlockEnd* end; - PRWord bytes, requestedBytes; - - h = p[0]; - tix = GET_TYPEIX(h); - bytes = OBJ_BYTES(h); - np = (PRWord *) ((char *)p + bytes); - if (tix != FREE_MEMORY_TYPEIX) { - PRInt32 test; /* msdev get's fooled without this local */ - /* A live object is here. The last word in the object will - contain the objects requestedSize */ - end = (GCBlockEnd*)((char*)(p) + bytes - sizeof(GCBlockEnd)); - test = end->check; - if (test != PR_BLOCK_END) { - PR_ASSERT(test == PR_BLOCK_END); - } - requestedBytes = end->requestedBytes; - if (requestedBytes >= bytes) EarthShatteringKaBoom(0); - cp = (char*)(p + 1) + requestedBytes; - i = (char) 0xff; - while (cp < (char*)end) { - if (*cp != i) EarthShatteringKaBoom(1); - cp++; - i--; - } - } - lastp = p; - p = np; - } else { - /* Must be a freelist item */ - GCFreeChunk *cp = (GCFreeChunk*) p; - if ((PRInt32)cp->chunkSize < (PRInt32)sizeof(GCFreeChunk)) { - EarthShatteringKaBoom(3); - } - lastp = p; - p = (PRWord*) ((char*)p + cp->chunkSize); - } - } -} - -static void CheckHeap(void) { - GCSeg *sp = segs; - GCSeg *esp = sp + nsegs; - while (sp < esp) { - CheckSegment(sp); - sp++; - } -} - -#endif /* GC_CHECK */ - -/******************************************************************************/ - -#ifdef DEBUG -long gc_thrash = -1L; -#endif - -/* -** Allocate memory from the GC Heap. Performs garbage collections if -** memory gets tight and grows the heap as needed. May return NULL if -** memory cannot be found. -*/ -PR_IMPLEMENT(PRWord GCPTR *)PR_AllocMemory( - PRWord requestedBytes, PRInt32 tix, PRWord flags) -{ - PRWord *p; - CollectorType *ct; - PRInt32 bytes; - GCFinal *final = 0; - GCWeak *weak = 0; - int dub = flags & PR_ALLOC_DOUBLE; - PRInt32 objBytes; -#ifdef GC_STATS - PRInt64 allocTime, ldelta; -#endif - - if (!allocationEnabled) return NULL; - - PR_ASSERT(requestedBytes >= 0); - PR_ASSERT(_pr_collectorTypes[tix].flags != 0); - -#ifdef DEBUG - if (_pr_do_a_dump) { - /* - ** Collect, pause for a second (lets finalizer run), and then GC - ** again. - */ - PR_GC(); - PR_Sleep(PR_MicrosecondsToInterval(1000000L)); - PR_GC(); - PR_DumpGCHeap(_pr_dump_file, PR_TRUE); - _pr_do_a_dump = 0; - } -#endif - -#ifdef GC_STATS - allocTime = PR_Now(); -#endif - bytes = (PRInt32) requestedBytes; - - /* - ** Align bytes to a multiple of a PRWord, then add in enough space - ** to hold the header word. - ** - ** MSVC 1.52 crashed on the ff. code because of the "complex" shifting :-( - */ - /* Check for possible overflow of bytes before performing add */ - if ((MAX_INT - PR_BYTES_PER_WORD) < bytes ) return NULL; - bytes = (bytes + PR_BYTES_PER_WORD - 1) >> PR_BYTES_PER_WORD_LOG2; - bytes <<= PR_BYTES_PER_WORD_LOG2; - /* Check for possible overflow of bytes before performing add */ - if ((MAX_INT - sizeof(PRWord)) < bytes ) return NULL; - bytes += sizeof(PRWord); - /* - * Add in an extra word of memory for double-aligned memory. Some - * percentage of the time this will waste a word of memory (too - * bad). Howver, it makes the allocation logic much simpler and - * faster. - */ -#ifndef IS_64 - if (dub) { - /* Check for possible overflow of bytes before performing add */ - if ((MAX_INT - PR_BYTES_PER_WORD) < bytes ) return NULL; - bytes += PR_BYTES_PER_WORD; - } -#endif - -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) { - /* Bloat the allocation a bit so that we can lay down - a check pattern that we will validate */ - /* Check for possible overflow of bytes before performing add */ - if ((MAX_INT - PR_BYTES_PER_WORD * 3) < bytes ) return NULL; - bytes += PR_BYTES_PER_WORD * 3; - } -#endif - -#if defined(GC_CHECK) || defined(GC_STATS) || defined(GC_TRACEROOTS) - if ((MAX_INT - sizeof(GCBlockEnd)) < bytes ) return NULL; - bytes += sizeof(GCBlockEnd); -#endif - - PR_ASSERT( bytes < MAX_ALLOC_SIZE ); - /* - ** Java can ask for objects bigger than MAX_ALLOC_SIZE, - ** but it won't get them. - */ - if (bytes >= MAX_ALLOC_SIZE) return NULL; - -#ifdef DEBUG - if (gc_thrash == -1L ? (gc_thrash = (long)PR_GetEnv("GC_THRASH")):gc_thrash) PR_GC(); -#endif - - ct = &_pr_collectorTypes[tix]; - if (ct->flags & (_GC_TYPE_FINAL|_GC_TYPE_WEAK)) { - if (0 != ct->gctype.finalize) { - /* - ** Allocate a GCFinal struct for this object in advance. Don't put - ** it on the pending list until we have allocated the object - */ - final = AllocFinalNode(); - if (!final) { - /* XXX THIS IS NOT ACCEPTABLE*/ - PR_ASSERT(0); - return 0; - } - } - if (0 != ct->gctype.getWeakLinkOffset) { - /* - ** Allocate a GCWeak struct for this object in advance. Don't put - ** it on the weak links list until we have allocated the object - */ - weak = AllocWeakNode(); - if (!weak) { - /* XXX THIS IS NOT ACCEPTABLE*/ - if (0 != final) { - FreeFinalNode(final); - } - PR_ASSERT(0); - return 0; - } - } - } - - LOCK_GC(); -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) CheckHeap(); - allocationCount++; -#endif - - /* Check for overflow of maximum size we can handle */ - if (bytes > MAX_ALLOC) goto lost; - - /* Try default allocation */ - p = ((bytes >= BIG_ALLOC) && (nsegs < MAX_SEGS)) ? - BigAlloc(tix, bytes, dub) : BinAlloc(tix, bytes, dub); - if (0 == p) { -#ifdef GC_STATS - LL_SUB(ldelta, PR_Now(), allocTime); -#endif - /* Collect some memory */ - _GCTRACE(GC_ALLOC, ("force GC: want %d", bytes)); - dogc(); - PR_ASSERT( GC_IS_LOCKED() ); - - /* After a collection we check and see if we should grow the - ** heap. We grow the heap when the amount of memory free is less - ** than a certain percentage of the heap size. We don't check to - ** see if the grow succeeded because our fallback strategy in - ** either case is to try one more time to allocate. */ - if ((_pr_gcData.allocMemory < _pr_gcData.maxMemory) - && ((_pr_gcData.freeMemory < - ((_pr_gcData.allocMemory * MIN_FREE_THRESHOLD_AFTER_GC) / 100L)) - || (_pr_gcData.freeMemory < bytes))) { - GrowHeap(PR_MAX(bytes, segmentSize)); - } -#ifdef GC_STATS - LL_ADD(allocTime, PR_Now(), ldelta); -#endif - - /* Try again */ - p = ((bytes >= BIG_ALLOC) && (nsegs < MAX_SEGS)) ? - BigAlloc(tix, bytes, dub) : BinAlloc(tix, bytes, dub); - if (0 == p) { - /* Well that lost big time. Memory must be pretty well fragmented */ - if (!GrowHeap(PR_MAX(bytes, segmentSize))) goto lost; - p = BinAlloc(tix, bytes, dub); - if (0 == p) goto lost; - } - } - - /* Zero out the portion of the object memory that was used by - the GCFreeChunk structure (skip the first word because it - was already overwritten by the gc header word) */ - objBytes = OBJ_BYTES(p[0]); - if (objBytes > sizeof(PRWord)) p[1] = 0; - if (objBytes > sizeof(PRWord)*2) p[2] = 0; - - if (final) { - _GCTRACE(GC_ALLOC, ("alloc 0x%x (%d) final=0x%x", - p, bytes, final)); - final->object = p; - PR_APPEND_LINK(&final->links, &_pr_finalizeableObjects); - } else { - _GCTRACE(GC_ALLOC, ("alloc 0x%x (%d)", p, bytes)); - } - if (weak) { - weak->object = p; - PR_APPEND_LINK(&weak->links, &_pr_weakLinks); - } - METER(meter.allocBytes += bytes); - METER(meter.wastedBytes += (bytes - requestedBytes)); - UNLOCK_GC(); - - if (collectorCleanupNeeded) { - CollectorCleanup(); - } - -#if defined(GC_CHECK) || defined(GC_STATS) || defined(GC_TRACEROOTS) - { - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - end->check = PR_BLOCK_END; - } -#endif -#ifdef GC_STATS - { - PRInt64 now = PR_Now(); - double delta; - PRInt32 bin; - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - - end->allocTime = allocTime; - LL_SUB(ldelta, now, allocTime); - LL_L2D(delta, ldelta); - InlineBinNumber(bin, requestedBytes); - end->bin = bin; - gcstats[bin].nallocs++; - gcstats[bin].allocTime += delta; - gcstats[bin].allocTimeVariance += delta * delta; - } -#endif -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) { - /* Place a pattern in the memory that was allocated that was not - requested. We will check the pattern later. */ - char* cp = (char*)(p + 1) + requestedBytes; - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - char i = (char) 0xff; - while (cp < (char*)end) { - *cp++ = i--; - } - end->requestedBytes = requestedBytes; - CheckHeap(); - } -#endif - return p + 1; - - lost: - /* Out of memory */ - UNLOCK_GC(); - if (final) { - FreeFinalNode(final); - } - if (weak) { - FreeWeakNode(weak); - } - if (collectorCleanupNeeded) { - CollectorCleanup(); - } - return 0; -} - -/* Shortcut allocator for objects that do not require finalization or - are weak objects */ -PR_IMPLEMENT(PRWord GCPTR *) -PR_AllocSimpleMemory(PRWord requestedBytes, PRInt32 tix) -{ - PRWord *p; - PRInt32 bytes; - PRInt32 objBytes; -#ifdef GC_STATS - PRInt64 allocTime, ldelta; -#endif - - if (!allocationEnabled) return NULL; - - PR_ASSERT(requestedBytes >= 0); - PR_ASSERT(_pr_collectorTypes[tix].flags != 0); - -#ifdef DEBUG - if (_pr_do_a_dump) { - /* - ** Collect, pause for a second (lets finalizer run), and then GC - ** again. - */ - PR_GC(); - PR_Sleep(PR_MicrosecondsToInterval(1000000L)); - PR_GC(); - PR_DumpGCHeap(_pr_dump_file, PR_TRUE); - _pr_do_a_dump = 0; - } -#endif - -#ifdef GC_STATS - allocTime = PR_NowMS(); -#endif - bytes = (PRInt32) requestedBytes; - - /* - ** Align bytes to a multiple of a PRWord, then add in enough space - ** to hold the header word. - ** - ** MSVC 1.52 crashed on the ff. code because of the "complex" shifting :-( - */ - bytes = (bytes + PR_BYTES_PER_WORD - 1) >> PR_BYTES_PER_WORD_LOG2; - bytes <<= PR_BYTES_PER_WORD_LOG2; - bytes += sizeof(PRWord); - - /* - * Add in an extra word of memory for double-aligned memory. Some - * percentage of the time this will waste a word of memory (too - * bad). Howver, it makes the allocation logic much simpler and - * faster. - */ -#ifndef IS_64 - bytes += PR_BYTES_PER_WORD; -#endif - -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) { - /* Bloat the allocation a bit so that we can lay down - a check pattern that we will validate */ - bytes += PR_BYTES_PER_WORD * 2; - } -#endif - -#if defined(GC_CHECK) || defined(GC_STATS) || defined(GC_TRACEROOTS) - bytes += sizeof(GCBlockEnd); -#endif - - /* Java can ask for objects bigger than 4M, but it won't get them */ - /* - * This check was added because there is a fundamental limit of - * the size field maintained by the gc code. Going over the 4M - * limit caused some bits to roll over into another bit field, - * violating the max segment size and causing a bug. - */ - if (bytes >= MAX_ALLOC_SIZE) { - return NULL; - } -#ifdef DEBUG - if (gc_thrash == -1L - ? (gc_thrash = (long)PR_GetEnv("GC_THRASH")) - : gc_thrash) { - PR_GC(); - } -#endif - - LOCK_GC(); -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) { - CheckHeap(); - } - allocationCount++; -#endif - - /* Try default allocation */ - if ((bytes >= BIG_ALLOC) && (nsegs < MAX_SEGS)) { - p = BigAlloc(tix, bytes, 1); - } else { - p = BinAlloc(tix, bytes, 1); - } - if (0 == p) { -#ifdef GC_STATS - LL_SUB(ldelta, PR_Now(), allocTime); -#endif - /* Collect some memory */ - _GCTRACE(GC_ALLOC, ("force GC: want %d", bytes)); - dogc(); - PR_ASSERT( GC_IS_LOCKED() ); - - /* After a collection we check and see if we should grow the - heap. We grow the heap when the amount of memory free is less - than a certain percentage of the heap size. We don't check to - see if the grow succeeded because our fallback strategy in - either case is to try one more time to allocate. */ - if ((_pr_gcData.allocMemory < _pr_gcData.maxMemory) && - (_pr_gcData.freeMemory < - ((_pr_gcData.allocMemory * MIN_FREE_THRESHOLD_AFTER_GC) / 100L))) { - GrowHeap(PR_MAX(bytes, segmentSize)); - } -#ifdef GC_STATS - LL_ADD(allocTime, PR_Now(), ldelta); -#endif - - /* Try one last time */ - if ((bytes >= BIG_ALLOC) && (nsegs < MAX_SEGS)) { - p = BigAlloc(tix, bytes, 1); - } else { - p = BinAlloc(tix, bytes, 1); - } - if (0 == p) { - /* Well that lost big time. Memory must be pretty well fragmented */ - if (!GrowHeap(PR_MAX(bytes, segmentSize))) { - goto lost; - } - p = BinAlloc(tix, bytes, 1); - if (0 == p) goto lost; - } - } - - /* Zero out the portion of the object memory that was used by - the GCFreeChunk structure (skip the first word because it - was already overwritten by the gc header word) */ - objBytes = OBJ_BYTES(p[0]); - if (objBytes > sizeof(PRWord)) p[1] = 0; - if (objBytes > sizeof(PRWord)*2) p[2] = 0; - - METER(meter.allocBytes += bytes); - METER(meter.wastedBytes += (bytes - requestedBytes)); - UNLOCK_GC(); - - if (collectorCleanupNeeded) { - CollectorCleanup(); - } - -#if defined(GC_CHECK) || defined(GC_STATS) || defined(GC_TRACEROOTS) - { - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - end->check = PR_BLOCK_END; - } -#endif -#ifdef GC_STATS - { - PRInt64 now = PR_Now(); - double delta; - PRInt32 bin; - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - - end->allocTime = allocTime; - LL_SUB(ldelta, now, allocTime); - LL_L2D(delta, ldelta); - InlineBinNumber(bin, requestedBytes); - end->bin = bin; - gcstats[bin].nallocs++; - gcstats[bin].allocTime += delta; - gcstats[bin].allocTimeVariance += delta * delta; - } -#endif -#ifdef GC_CHECK - if (_pr_gcData.flags & GC_CHECK) { - /* Place a pattern in the memory that was allocated that was not - requested. We will check the pattern later. */ - char* cp = (char*)(p + 1) + requestedBytes; - GCBlockEnd* end = (GCBlockEnd*)((char*)p + OBJ_BYTES(p[0]) - sizeof(GCBlockEnd)); - char i = (char) 0xff; - while (cp < (char*)end) { - *cp++ = i--; - } - end->requestedBytes = requestedBytes; - CheckHeap(); - } -#endif - return p + 1; - - lost: - /* Out of memory */ - UNLOCK_GC(); - if (collectorCleanupNeeded) { - CollectorCleanup(); - } - return 0; -} - -/************************************************************************/ - -PR_IMPLEMENT(PRWord) PR_GetObjectHeader(void *ptr) { - GCSeg *sp; - PRWord *h; - - if (ptr == 0) return 0; - sp = InHeap(ptr); - if (sp == 0) return 0; - h = (PRWord*)FindObject(sp, (PRWord*)ptr); - return GC_GET_USER_BITS(h[0]); -} - -PR_IMPLEMENT(PRWord) PR_SetObjectHeader(void *ptr, PRWord newUserBits) { - GCSeg *sp; - PRWord *h, rv; - - if (ptr == 0) return 0; - sp = InHeap(ptr); - if (sp == 0) return 0; - h = (PRWord*)FindObject(sp, (PRWord*)ptr); - rv = GC_GET_USER_BITS(h[0]); - h[0] = (h[0] & ~GC_USER_BITS) | - ((newUserBits << GC_USER_BITS_SHIFT) & GC_USER_BITS); - return rv; -} - -PR_IMPLEMENT(void) PR_InitGC( - PRWord flags, PRInt32 initialHeapSize, PRInt32 segSize, PRThreadScope scope) -{ - static char firstTime = 1; - - if (!firstTime) return; - firstTime = 0; - - _pr_msgc_lm = PR_NewLogModule("msgc"); - _pr_pageShift = PR_GetPageShift(); - _pr_pageSize = PR_GetPageSize(); - - /* Setup initial heap size and initial segment size */ - if (0 != segSize) segmentSize = segSize; -#ifdef DEBUG - GC = PR_NewLogModule("GC"); - { - char *ev = PR_GetEnv("GC_SEGMENT_SIZE"); - if (ev && ev[0]) { - PRInt32 newSegmentSize = atoi(ev); - if (0 != newSegmentSize) segmentSize = newSegmentSize; - } - ev = PR_GetEnv("GC_INITIAL_HEAP_SIZE"); - if (ev && ev[0]) { - PRInt32 newInitialHeapSize = atoi(ev); - if (0 != newInitialHeapSize) initialHeapSize = newInitialHeapSize; - } - ev = PR_GetEnv("GC_FLAGS"); - if (ev && ev[0]) { - flags |= atoi(ev); - } -#ifdef GCMETER - ev = PR_GetEnv("GC_METER"); - if (ev && ev[0]) { - _pr_gcMeter = atoi(ev); - } -#endif - } -#endif - if (0 == initialHeapSize) initialHeapSize = segmentSize; - if (initialHeapSize < segmentSize) initialHeapSize = segmentSize; - - _pr_gcData.maxMemory = MAX_SEGS * segmentSize; - _pr_gcData.liveBlock = ProcessRootBlock; - _pr_gcData.livePointer = ProcessRootPointer; - _pr_gcData.processRootBlock = ProcessRootBlock; - _pr_gcData.processRootPointer = ProcessRootPointer; - _pr_gcData.dumpOutput = NULL; - - PR_INIT_CLIST(&_pr_finalizeableObjects); - PR_INIT_CLIST(&_pr_finalQueue); - _PR_InitGC(flags); - - /* Create finalizer thread */ - _PR_CreateFinalizer(scope); - - /* Allocate the initial segment for the heap */ - minBin = 31; - maxBin = 0; - GrowHeap(initialHeapSize); - PR_RegisterRootFinder(ScanWeakFreeList, "scan weak free list", 0); -} - -/** Added by Vishy for sanity checking a few GC structures **/ -/** Can use SanityCheckGC to debug corrupted GC Heap situations **/ - -#ifdef DEBUG - -static int SegmentOverlaps(int i, int j) -{ - return - (((segs[i].limit > segs[j].base) && (segs[i].base < segs[j].base)) || - ((segs[j].limit > segs[i].base) && (segs[j].base < segs[i].base))); -} - -static void NoSegmentOverlaps(void) -{ - int i,j; - - for (i = 0; i < nsegs; i++) - for (j = i+1 ; j < nsegs ; j++) - PR_ASSERT(!SegmentOverlaps(i,j)); -} - -static void SegInfoCheck(void) -{ - int i; - for (i = 0 ; i < nsegs ; i++) - PR_ASSERT((segs[i].info->hbits) && - (segs[i].info->hbits == segs[i].hbits) && - (segs[i].info->base == segs[i].base) && - (segs[i].info->limit == segs[i].limit)); -} - -static void SanityCheckGC() -{ - NoSegmentOverlaps(); - SegInfoCheck(); -} - -#endif - -#if defined(DEBUG) && defined(WIN32) - -extern void *baseaddr; -extern void *lastaddr; - -PR_IMPLEMENT(void) -PR_PrintGCStats(void) -{ - long reportedSegSpace = _pr_gcData.busyMemory + _pr_gcData.freeMemory; - char* msg; - long largeCount = 0, largeSize = 0; - long segCount = 0, segSize = 0; - long freeCount = 0, freeSize = 0; - GCSeg *sp, *esp; - GCSegInfo* si; - - LOCK_GC(); - - sp = segs; - esp = sp + nsegs; - while (sp < esp) { - long size = sp->info->limit - sp->info->base; - segCount++; - segSize += size; - if (sp->info->fromMalloc) { - largeCount++; - largeSize += size; - } - sp++; - } - - si = freeSegs; - while (si != NULL) { - long size = si->limit - si->base; - freeCount++; - freeSize += size; - si = si->next; - } - - msg = PR_smprintf("\ -# GC Stats:\n\ -# vm space:\n\ -# range: %ld - %ld\n\ -# size: %ld\n\ -# segments:\n\ -# range: %ld - %ld\n\ -# count: %ld (reported: %ld)\n\ -# size: %ld (reported: %ld)\n\ -# free count: %ld\n\ -# free size: %ld\n\ -# busy objs: %ld (%ld%%)\n\ -# free objs: %ld (%ld%%)\n\ -# large blocks:\n\ -# count: %ld\n\ -# total size: %ld (%ld%%)\n\ -# avg size: %ld\n\ -", - /* vm space */ - (long)baseaddr, (long)lastaddr, - (long)lastaddr - (long)baseaddr, - /* segments */ - _pr_gcData.lowSeg, _pr_gcData.highSeg, - segCount, nsegs, - segSize, reportedSegSpace, - freeCount, - freeSize, - _pr_gcData.busyMemory, - (_pr_gcData.busyMemory * 100 / reportedSegSpace), - _pr_gcData.freeMemory, - (_pr_gcData.freeMemory * 100 / reportedSegSpace), - /* large blocks */ - largeCount, - largeSize, (largeSize * 100 / reportedSegSpace), - (largeCount ? largeSize / largeCount : 0) - ); - UNLOCK_GC(); - fprintf(stderr, msg); - OutputDebugString(msg); - PR_smprintf_free(msg); -#ifdef GC_STATS - PR_PrintGCAllocStats(); -#endif -} -#endif - -PR_IMPLEMENT(void) -PR_DumpToFile(char* filename, char* msg, PRFileDumper dump, PRBool detailed) -{ - FILE *out; - OutputDebugString(msg); - out = fopen(filename, "a"); - if (!out) { - char buf[64]; - PR_ASSERT(strlen(filename) < sizeof(buf) - 16); - PR_snprintf(buf, sizeof(buf), "Can't open \"%s\"\n", - filename); - OutputDebugString(buf); - } - else - { - struct tm *newtime; - time_t aclock; - int i; - - time(&aclock); - newtime = localtime(&aclock); - fprintf(out, "%s on %s\n", msg, asctime(newtime)); /* Print current time */ - dump(out, detailed); - fprintf(out, "\n\n"); - for (i = 0; i < 80; i++) - fprintf(out, "="); - fprintf(out, "\n\n"); - fclose(out); - } - OutputDebugString(" done\n"); -} - diff --git a/nsprpub/lib/msgc/src/unixgc.c b/nsprpub/lib/msgc/src/unixgc.c deleted file mode 100644 index cea4225ebee6..000000000000 --- a/nsprpub/lib/msgc/src/unixgc.c +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "prlock.h" -#include "prlog.h" -#include "prmem.h" -#include "gcint.h" - -#include -#include -#include -#include -#include - -#define _PR_GC_VMBASE 0x40000000 - -#if defined(SOLARIS) -#define _MD_MMAP_FLAGS MAP_SHARED -#elif defined(RELIANTUNIX) -#define _MD_MMAP_FLAGS MAP_PRIVATE|MAP_FIXED -#else -#define _MD_MMAP_FLAGS MAP_PRIVATE -#endif - -static PRInt32 zero_fd = -1; -static PRLock *zero_fd_lock = NULL; - -void _MD_InitGC(void) -{ -#ifdef DEBUG - /* - * Disable using mmap(2) if NSPR_NO_MMAP is set - */ - if (getenv("NSPR_NO_MMAP")) { - zero_fd = -2; - return; - } -#endif - zero_fd = open("/dev/zero",O_RDWR , 0); - zero_fd_lock = PR_NewLock(); -} - -/* This static variable is used by _MD_GrowGCHeap and _MD_ExtendGCHeap */ -static void *lastaddr = (void*) _PR_GC_VMBASE; - -void *_MD_GrowGCHeap(PRUint32 *sizep) -{ - void *addr; - PRUint32 size; - - size = *sizep; - - PR_Lock(zero_fd_lock); - if (zero_fd < 0) { - goto mmap_loses; - } - - /* Extend the mapping */ - addr = mmap(lastaddr, size, PROT_READ|PROT_WRITE|PROT_EXEC, - _MD_MMAP_FLAGS, - zero_fd, 0); - if (addr == (void*)-1) { - zero_fd = -1; - goto mmap_loses; - } - lastaddr = ((char*)addr + size); -#ifdef DEBUG - PR_LOG(_pr_msgc_lm, PR_LOG_WARNING, - ("GC: heap extends from %08x to %08x\n", - _PR_GC_VMBASE, - _PR_GC_VMBASE + (char*)lastaddr - (char*)_PR_GC_VMBASE)); -#endif - PR_Unlock(zero_fd_lock); - return addr; - -mmap_loses: - PR_Unlock(zero_fd_lock); - return PR_MALLOC(size); -} - -/* XXX - This is disabled. MAP_FIXED just does not work. */ -#if 0 -PRBool _MD_ExtendGCHeap(char *base, PRInt32 oldSize, PRInt32 newSize) { - PRBool rv = PR_FALSE; - void* addr; - PRInt32 allocSize = newSize - oldSize; - - PR_Lock(zero_fd_lock); - addr = mmap(base + oldSize, allocSize, PROT_READ|PROT_WRITE|PROT_EXEC, - _MD_MMAP_FLAGS | MAP_FIXED, zero_fd, 0); - if (addr == (void*)-1) { - goto loser; - } - if (addr != (void*) (base + oldSize)) { - munmap(base + oldSize, allocSize); - goto loser; - } - lastaddr = ((char*)base + newSize); - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, - ("GC: heap now extends from %p to %p", - base, base + newSize)); - rv = PR_TRUE; - -loser: - PR_Unlock(zero_fd_lock); - return rv; -} -#else -PRBool _MD_ExtendGCHeap(char *base, PRInt32 oldSize, PRInt32 newSize) { - return PR_FALSE; -} -#endif - -void _MD_FreeGCSegment(void *base, PRInt32 len) -{ - if (zero_fd < 0) { - PR_DELETE(base); - } else { - (void) munmap(base, len); - } -} diff --git a/nsprpub/lib/msgc/src/win32gc.c b/nsprpub/lib/msgc/src/win32gc.c deleted file mode 100644 index eec83774eb19..000000000000 --- a/nsprpub/lib/msgc/src/win32gc.c +++ /dev/null @@ -1,129 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/* - * GC related routines - * - */ -#include -#include "prlog.h" - -extern PRLogModuleInfo* _pr_msgc_lm; - -#define GC_VMBASE 0x40000000 -#define GC_VMLIMIT 0x00FFFFFF - -/************************************************************************/ -/* -** Machine dependent GC Heap management routines: -** _MD_GrowGCHeap -*/ -/************************************************************************/ - -void *baseaddr = (void*) GC_VMBASE; -void *lastaddr = (void*) GC_VMBASE; - -void _MD_InitGC() {} - -void *_MD_GrowGCHeap(PRUint32 *sizep) -{ - void *addr; - size_t size; - - /* Reserve a block of memory for the GC */ - if( lastaddr == baseaddr ) { - addr = VirtualAlloc( (void *)GC_VMBASE, GC_VMLIMIT, MEM_RESERVE, PAGE_READWRITE ); - - /* - ** If the GC_VMBASE address is already mapped, then let the OS choose a - ** base address that is available... - */ - if (addr == NULL) { - addr = VirtualAlloc( NULL, GC_VMLIMIT, MEM_RESERVE, PAGE_READWRITE ); - - baseaddr = lastaddr = addr; - if (addr == NULL) { - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: unable to allocate heap: LastError=%ld", - GetLastError())); - return 0; - } - } - } - size = *sizep; - - /* Extend the mapping */ - addr = VirtualAlloc( lastaddr, size, MEM_COMMIT, PAGE_READWRITE ); - if (addr == NULL) { - return 0; - } - - lastaddr = ((char*)addr + size); - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, - ("GC: heap extends from %08x to %08x", - baseaddr, (long)baseaddr + (char*)lastaddr - (char*)baseaddr)); - - return addr; -} - -PRBool _MD_ExtendGCHeap(char *base, PRInt32 oldSize, PRInt32 newSize) { - void* addr; - - addr = VirtualAlloc( base + oldSize, newSize - oldSize, - MEM_COMMIT, PAGE_READWRITE ); - if (NULL == addr) { - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: unable to extend heap: LastError=%ld", - GetLastError())); - return PR_FALSE; - } - if (base + oldSize != (char*)addr) { - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, ("GC: segment extension returned %x instead of %x", - addr, base + oldSize)); - VirtualFree(addr, newSize - oldSize, MEM_DECOMMIT); - return PR_FALSE; - } - lastaddr = base + newSize; - PR_LOG(_pr_msgc_lm, PR_LOG_ALWAYS, - ("GC: heap now extends from %p to %p", - base, base + newSize)); - return PR_TRUE; -} - - -void _MD_FreeGCSegment(void *base, PRInt32 len) -{ - (void)VirtualFree(base, 0, MEM_RELEASE); -} diff --git a/nsprpub/lib/msgc/tests/.cvsignore b/nsprpub/lib/msgc/tests/.cvsignore deleted file mode 100644 index f3c7a7c5da68..000000000000 --- a/nsprpub/lib/msgc/tests/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -Makefile diff --git a/nsprpub/lib/msgc/tests/Makefile.in b/nsprpub/lib/msgc/tests/Makefile.in deleted file mode 100644 index 51031ed39bbf..000000000000 --- a/nsprpub/lib/msgc/tests/Makefile.in +++ /dev/null @@ -1,270 +0,0 @@ -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape Portable Runtime (NSPR). -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** - -#! gmake - -MOD_DEPTH = ../../.. -topsrcdir = @top_srcdir@ -srcdir = @srcdir@ -VPATH = @srcdir@ - -include $(MOD_DEPTH)/config/autoconf.mk - -include $(topsrcdir)/config/config.mk - -ifeq ($(OS_TARGET), OS2) -OS_CFLAGS = $(OS_EXE_CFLAGS) -endif - -CSRCS = gc1.c thrashgc.c - -ifeq (,$(filter-out WINNT OS2,$(OS_ARCH))) -PROG_SUFFIX = .exe -else -PROG_SUFFIX = -endif - -PROGS = $(addprefix $(OBJDIR)/, $(CSRCS:.c=$(PROG_SUFFIX))) - -TARGETS = $(PROGS) $(OBJS) - -INCLUDES = -I$(dist_includedir) - -# Setting the variables LDOPTS and LIBPR. We first initialize -# them to the default values, then adjust them for some platforms. -LDOPTS = -L$(dist_libdir) -NSPR_VERSION = $(MOD_MAJOR_VERSION) -GC_VERSION = $(MOD_MAJOR_VERSION) -LIBPR = -lnspr$(NSPR_VERSION) -LIBPLC = -lplc$(NSPR_VERSION) -LIBGC = -lmsgc$(GC_VERSION) - -ifeq ($(OS_ARCH), WINNT) - LDOPTS = -NOLOGO -DEBUG -INCREMENTAL:NO - LIBPR = $(dist_libdir)/libnspr$(NSPR_VERSION).$(LIB_SUFFIX) - LIBPLC = $(dist_libdir)/libplc$(NSPR_VERSION).$(LIB_SUFFIX) - LIBGC= $(dist_libdir)/libmsgc$(GC_VERSION).$(LIB_SUFFIX) -endif - -ifeq ($(OS_ARCH),OS2) - LDOPTS += -Zomf -Zlinker /PM:VIO -endif - -ifneq ($(OS_ARCH), WINNT) -PWD = $(shell pwd) -endif - -ifeq ($(OS_ARCH), IRIX) -LDOPTS += -rpath $(PWD)/$(dist_libdir) -rdata_shared - -# For 6.x machines, include this flag -ifeq ($(basename $(OS_RELEASE)),6) -ifeq ($(USE_N32),1) -LDOPTS += -n32 -else -LDOPTS += -32 -endif -endif - -endif - -ifeq ($(OS_ARCH), OSF1) -# I haven't figured out how to pass -rpath to cc on OSF1 V3.2, so -# we do static linking. -ifeq ($(OS_RELEASE), V3.2) - LIBPR = $(dist_libdir)/libnspr$(NSPR_VERSION).a - LIBPLC = $(dist_libdir)/libplc$(NSPR_VERSION).a - LIBGC = $(dist_libdir)/libmsgc$(GC_VERSION).a - EXTRA_LIBS = -lc_r -else - LDOPTS += -rpath $(PWD)/$(dist_libdir) -endif -endif - -ifeq ($(OS_ARCH), HP-UX) -LDOPTS += -z -Wl,+s,+b,$(PWD)/$(dist_libdir) -endif - -# AIX -ifeq ($(OS_ARCH),AIX) -LDOPTS += -blibpath:$(PWD)/$(dist_libdir):/usr/lib:/lib -ifeq ($(OS_ARCH)$(OS_RELEASE),AIX4.1) -LIBPR = -lnspr$(NSPR_VERSION)_shr -LIBPLC = -lplc$(NSPR_VERSION)_shr -LIBGC = -lmsgc$(GC_VERSION)_shr -else -LDOPTS += -brtl -EXTRA_LIBS = -ldl -endif -endif - -# Solaris -ifeq ($(OS_ARCH), SunOS) -ifneq ($(OS_RELEASE), 4.1.3_U1) -ifdef NS_USE_GCC -LDOPTS += -Xlinker -R -Xlinker $(PWD)/$(dist_libdir) -else -LDOPTS += -R $(PWD)/$(dist_libdir) -endif -endif - -# SunOS 5.5 needs to link with -lpthread, even though we already -# linked with this system library when we built libnspr.so. -ifeq ($(OS_RELEASE), 5.5) -ifdef USE_PTHREADS -EXTRA_LIBS = -lpthread -endif -endif -endif # SunOS - -ifeq ($(OS_ARCH),NEC) -EXTRA_LIBS = $(OS_LIBS) -# This hardcodes in the executable programs the directory to find -# libnspr.so etc. at program startup. Equivalent to the -R or -rpath -# option for ld on other platforms. -export LD_RUN_PATH = $(PWD)/$(dist_libdir) -endif - -ifeq ($(OS_ARCH), NCR) -# XXX: We see some strange problems when we link with libnspr.so. -# So for now we use static libraries on NCR. The shared library -# stuff below is commented out. -LIBPR = $(dist_libdir)/libnspr$(NSPR_VERSION).a -LIBPLC = $(dist_libdir)/libplc$(NSPR_VERSION).a -LIBGC = $(dist_libdir)/libmsgc$(GC_VERSION).a -EXTRA_LIBS = -lsocket -lnsl -ldl - -# NCR needs to link against -lsocket -lnsl (and -lc, which is linked -# implicitly by $(CC)) again even though we already linked with these -# system libraries when we built libnspr.so. -#EXTRA_LIBS = -lsocket -lnsl -# This hardcodes in the executable programs the directory to find -# libnspr.so etc. at program startup. Equivalent to the -R or -rpath -# option for ld on other platforms. -#export LD_RUN_PATH = $(PWD)/$(dist_libdir) -endif - -ifeq ($(OS_ARCH), Linux) -ifeq ($(OS_RELEASE), 1.2) -EXTRA_LIBS = -ldl -endif -endif - -ifeq ($(OS_ARCH), SCOOS) -# SCO Unix needs to link against -lsocket again even though we -# already linked with these system libraries when we built libnspr.so. -EXTRA_LIBS = -lsocket -# This hardcodes in the executable programs the directory to find -# libnspr.so etc. at program startup. Equivalent to the -R or -rpath -# option for ld on other platforms. -export LD_RUN_PATH = $(PWD)/$(dist_libdir) -endif - -ifeq ($(OS_ARCH),SINIX) -EXTRA_LIBS = -lsocket -lnsl -lresolv -ldl -# This hardcodes in the executable programs the directory to find -# libnspr.so etc. at program startup. Equivalent to the -R or -rpath -# option for ld on other platforms. -export LD_RUN_PATH = $(PWD)/$(dist_libdir) -endif - -ifeq ($(OS_ARCH), UNIXWARE) -export LD_RUN_PATH = $(PWD)/$(dist_libdir) -endif - -ifeq ($(OS_ARCH),BSD_OS) -EXTRA_LIBS = -ldl -endif - -ifeq ($(OS_ARCH),DGUX) -EXTRA_LIBS = -lsocket -lnsl -ldl -endif - -##################################################### -# -# The rules -# -##################################################### - -include $(topsrcdir)/config/rules.mk - -AIX_PRE_4_2 = 0 -ifeq ($(OS_ARCH),AIX) -ifneq ($(OS_RELEASE),4.2) -ifneq ($(USE_PTHREADS), 1) -#AIX_PRE_4_2 = 1 -endif -endif -endif - -ifeq ($(AIX_PRE_4_2),1) - -# AIX releases prior to 4.2 need a special two-step linking hack -# in order to both override the system select() and be able to -# get at the original system select(). -# -# We use a pattern rule in ns/nspr20/config/rules.mk to generate -# the .$(OBJ_SUFFIX) file from the .c source file, then do the -# two-step linking hack below. - -$(OBJDIR)/%: $(OBJDIR)/%.$(OBJ_SUFFIX) - @$(MAKE_OBJDIR) - rm -f $@ $(AIX_TMP) - $(CC) $(AIX_LINK_OPTS) -o $(AIX_TMP) $< $(dist_libdir)/libnspr$(NSPR_VERSION).a - $(CC) -o $@ $(AIX_TMP) $(AIX_WRAP) - rm -f $(AIX_TMP) - -else - -# All platforms that are not AIX pre-4.2. - -$(OBJDIR)/%$(PROG_SUFFIX): $(OBJDIR)/%.$(OBJ_SUFFIX) - @$(MAKE_OBJDIR) -ifeq ($(OS_ARCH), WINNT) - link $(LDOPTS) $< $(LIBGC) $(LIBPLC) $(LIBPR) wsock32.lib -out:$@ -else -ifeq ($(OS_ARCH),OS2) - $(LINK) $(LDOPTS) $< $(LIBGC) $(LIBPLC) $(LIBPR) $(OS_LIBS) $(EXTRA_LIBS) -o $@ -else - $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBGC) $(LIBPLC) $(LIBPR) $(EXTRA_LIBS) -o $@ -endif -endif -endif - -export:: $(TARGETS) -clean:: - rm -f $(TARGETS) diff --git a/nsprpub/lib/msgc/tests/gc1.c b/nsprpub/lib/msgc/tests/gc1.c deleted file mode 100644 index 9bd485e92489..000000000000 --- a/nsprpub/lib/msgc/tests/gc1.c +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/*********************************************************************** -** Includes -***********************************************************************/ -/* Used to get the command line option */ -#include "plgetopt.h" - -#include "prgc.h" -#include "prinit.h" -#include "prmon.h" -#include "prinrval.h" -#include "private/pprthred.h" - -#include -#include - -static PRMonitor *mon; -static PRInt32 threads, waiting, iterations; -static PRInt32 scanCount, finalizeCount, freeCount; - -PRIntn failed_already=0; -PRIntn debug_mode; - - -typedef struct Array { - PRUintn size; - void *body[1]; -} Array; - -int arrayTypeIndex; - -static void PR_CALLBACK ScanArray(void *a) -{ -/* printf ("In ScanArray a = %X size = %d \n", a, a->size); */ - scanCount++; -} - -static void PR_CALLBACK FinalizeArray(void *a) -{ -/* printf ("In FinalizeArray a = %X size = %d \n", a, a->size); */ - finalizeCount++; -} - -static void PR_CALLBACK FreeArray(void *a) -{ -/* printf ("In FreeArray\n"); */ - freeCount++; -} - -static Array *NewArray(PRUintn size) -{ - Array *a; - - a = (Array *)PR_AllocMemory(sizeof(Array) + size*sizeof(void*) - 1*sizeof(void*), - arrayTypeIndex, PR_ALLOC_CLEAN); - -/* printf ("In NewArray a = %X \n", a); */ - - if (a) - a->size = size; - return a; -} - -GCType arrayType = { - ScanArray, - FinalizeArray, - 0, - 0, - FreeArray, - 0 -}; - -static void Initialize(void) -{ - PR_InitGC(0, 0, 0, PR_GLOBAL_THREAD); - arrayTypeIndex = PR_RegisterType(&arrayType); -} - -static void PR_CALLBACK AllocateLikeMad(void *arg) -{ - Array *prev; - PRInt32 i; - PRInt32 count; - - count = (PRInt32)arg; - prev = 0; - for (i = 0; i < count; i++) { - Array *leak = NewArray(i & 511); - if ((i & 1023) == 0) { - prev = 0; /* forget */ - } else { - if (i & 1) { - prev = leak; /* remember */ - } - } - } - PR_EnterMonitor(mon); - waiting++; - PR_Notify(mon); - PR_ExitMonitor(mon); -} - -int main(int argc, char **argv) -{ - PRIntervalTime start, stop, usec; - double d; - PRIntn i, totalIterations; - /* The command line argument: -d is used to determine if the test is being run - in debug mode. The regress tool requires only one line output:PASS or FAIL. - All of the printfs associated with this test has been handled with a if (debug_mode) - test. - Usage: test_name -d - */ - PLOptStatus os; - PLOptState *opt = PL_CreateOptState(argc, argv, "dt:c:"); - - threads = 10; - iterations = 100; - - while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) - { - if (PL_OPT_BAD == os) { - fprintf(stderr, "Invalid command-line option\n"); - exit(1); - } - switch (opt->option) - { - case 'd': /* debug mode */ - debug_mode = 1; - break; - case 't': /* number of threads */ - threads = atoi(opt->value); - break; - case 'c': /* iteration count */ - iterations = atoi(opt->value); - break; - default: - break; - } - } - PL_DestroyOptState(opt); - - fprintf(stderr, "t is %ld, i is %ld\n", (long) threads, (long) iterations); - /* main test */ - - PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 5); - PR_STDIO_INIT(); - Initialize(); - - /* Spin all of the allocator threads and then wait for them to exit */ - start = PR_IntervalNow(); - mon = PR_NewMonitor(); - PR_EnterMonitor(mon); - waiting = 0; - for (i = 0; i < threads; i++) { - (void) PR_CreateThreadGCAble(PR_USER_THREAD, - AllocateLikeMad, (void*)iterations, - PR_PRIORITY_NORMAL, - PR_LOCAL_THREAD, - PR_UNJOINABLE_THREAD, - 0); - } - while (waiting != threads) { - PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); - } - PR_ExitMonitor(mon); - - PR_GC(); - PR_ForceFinalize(); - - totalIterations = iterations * threads; -/* - if (scanCount != totalIterations) - printf ("scanCount discrepancy scanCount = %d totalIterations = %d \n", - scanCount, totalIterations); - if (freeCount != totalIterations) - printf ("freeCount discrepancy freeCount = %d totalIterations = %d \n", - freeCount, totalIterations); - if ((finalizeCount != totalIterations) && (finalizeCount != (totalIterations-1))) - printf ("finalizeCount discrepancy finalizeCount = %d totalIterations = %d \n", - finalizeCount,totalIterations); -*/ - - stop = PR_IntervalNow(); - - usec = stop = stop - start; - d = (double)usec; - - if (debug_mode) printf("%40s: %6.2f usec\n", "GC allocation", d / (iterations * threads)); - else { - if (d == 0.0) failed_already = PR_TRUE; - - } - - PR_Cleanup(); - if(failed_already) - { - printf("FAIL\n"); - return 1; - } - else - { - printf("PASS\n"); - return 0; - } -} diff --git a/nsprpub/lib/msgc/tests/thrashgc.c b/nsprpub/lib/msgc/tests/thrashgc.c deleted file mode 100644 index a440d4949b17..000000000000 --- a/nsprpub/lib/msgc/tests/thrashgc.c +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is the Netscape Portable Runtime (NSPR). - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998-2000 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -/*********************************************************************** -** Name: thrashgc -** -** Description: test garbace collection functions. -** -** Modification History: -** 19-May-97 AGarcia- Converted the test to accomodate the debug_mode flag. -** The debug mode will print all of the printfs associated with this test. -** The regress mode will be the default mode. Since the regress tool limits -** the output to a one line status:PASS or FAIL,all of the printf statements -** have been handled with an if (debug_mode) statement. -** 04-June-97 AGarcia removed the Test_Result function. Regress tool has been updated to -** recognize the return code from tha main program. -***********************************************************************/ -/*********************************************************************** -** Includes -***********************************************************************/ -#include "prthread.h" -#include "prgc.h" -#include "prprf.h" -#include "prinrval.h" -#include "prlock.h" -#include "prinit.h" -#include "prcvar.h" - -#include "private/pprthred.h" - -#include -#include -#include - - -PRIntn failed_already=0; -PRIntn debug_mode; - -static char* progname; -static PRInt32 loops = 1000; -static int tix1, tix2, tix3; -static GCInfo* gcInfo; -static PRLock* stderrLock; - -typedef struct Type1 Type1; -typedef struct Type2 Type2; - -struct Type1 { - Type2* atwo; - Type1* next; -}; - -struct Type2 { - void* buf; -}; - -static void PR_CALLBACK ScanType1(void *obj) { - gcInfo->livePointer(((Type1 *)obj)->atwo); - gcInfo->livePointer(((Type1 *)obj)->next); -} - -static void PR_CALLBACK ScanType2(void *obj) { - gcInfo->livePointer(((Type2 *)obj)->buf); -} - -static GCType type1 = { - ScanType1 -}; - -static GCType type2 = { - ScanType2 -/* (void (*)(void*)) ScanType2 */ -}; - -static GCType type3 = { - 0 -}; - -Type1* NewType1(void) { - Type1* p = (Type1*) PR_AllocMemory(sizeof(Type1), tix1, PR_ALLOC_DOUBLE); - PR_ASSERT(p != NULL); - return p; -} - -Type2* NewType2(void) { - Type2* p = (Type2*) PR_AllocMemory(sizeof(Type2), tix2, PR_ALLOC_DOUBLE); - PR_ASSERT(p != NULL); - return p; -} - -void* NewBuffer(PRInt32 size) { - void* p = PR_AllocMemory(size, tix3, PR_ALLOC_DOUBLE); - PR_ASSERT(p != NULL); - return p; -} - -/* Allocate alot of garbage */ -static void PR_CALLBACK AllocStuff(void *unused) { - PRInt32 i; - void* danglingRefs[50]; - PRIntervalTime start, end; - char msg[100]; - - start = PR_IntervalNow(); - for (i = 0; i < loops; i++) { - void* p; - if (i & 1) { - Type1* t1 = NewType1(); - t1->atwo = NewType2(); - t1->next = NewType1(); - t1->atwo->buf = NewBuffer(100); - p = t1; - } else { - Type2* t2 = NewType2(); - t2->buf = NewBuffer(i & 16383); - p = t2; - } - if ((i % 10) == 0) { - memmove(&danglingRefs[0], &danglingRefs[1], 49*sizeof(void*)); - danglingRefs[49] = p; - } - } - end = PR_IntervalNow(); - if (debug_mode) PR_snprintf(msg, sizeof(msg), "Thread %p: %ld allocations took %ld ms", - PR_GetCurrentThread(), loops, - PR_IntervalToMilliseconds((PRIntervalTime) (end - start))); - PR_Lock(stderrLock); - fprintf(stderr, "%s\n", msg); - PR_Unlock(stderrLock); - } - -static void usage(char *progname) { - fprintf(stderr, "Usage: %s [-t threads] [-l loops]\n", progname); - exit(-1); -} - -static int realMain(int argc, char **argv, char *notused) { - int i; - int threads = 0; - - progname = strrchr(argv[0], '/'); - if (progname == 0) progname = argv[0]; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-t") == 0) { - if (i == argc - 1) { - usage(progname); - } - threads = atoi(argv[++i]); - if (threads < 0) threads = 0; - if (threads > 10000) threads = 10000; - continue; - } - if (strcmp(argv[i], "-l") == 0) { - if (i == argc - 1) { - usage(progname); - } - loops = atoi(argv[++i]); - continue; - } - usage(progname); - } - - for (i = 0; i < threads; i++) { - PRThread* thread; - - /* XXXXX */ - thread = PR_CreateThreadGCAble(PR_USER_THREAD, /* thread type */ - AllocStuff, /* start function */ - NULL, /* arg */ - PR_PRIORITY_NORMAL, /* priority */ - PR_LOCAL_THREAD, /* thread scope */ - PR_UNJOINABLE_THREAD, /* thread state */ - 0); /* stack size */ - if (thread == 0) { - fprintf(stderr, "%s: no more threads (only %d were created)\n", - progname, i); - break; - } - } - AllocStuff(NULL); - return 0; -} - -static int padMain(int argc, char **argv) { - char pad[512]; - return realMain(argc, argv, pad); -} - -int main(int argc, char **argv) { - int rv; - - debug_mode = 1; - - PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); - PR_SetThreadGCAble(); - - PR_InitGC(0, 0, 0, PR_GLOBAL_THREAD); - PR_STDIO_INIT(); - stderrLock = PR_NewLock(); - tix1 = PR_RegisterType(&type1); - tix2 = PR_RegisterType(&type2); - tix3 = PR_RegisterType(&type3); - gcInfo = PR_GetGCInfo(); - rv = padMain(argc, argv); - printf("PASS\n"); - PR_Cleanup(); - return rv; -} diff --git a/nsprpub/pr/include/md/_darwin.h b/nsprpub/pr/include/md/_darwin.h index fc377984a3ba..619b43ae4c7e 100644 --- a/nsprpub/pr/include/md/_darwin.h +++ b/nsprpub/pr/include/md/_darwin.h @@ -42,8 +42,9 @@ #include -#ifdef XP_MACOSX +#ifdef __APPLE__ #include +#include #endif #define PR_LINKER_ARCH "darwin" @@ -54,6 +55,8 @@ #define _PR_SI_ARCHITECTURE "x86-64" #elif defined(__ppc__) #define _PR_SI_ARCHITECTURE "ppc" +#elif defined(__arm__) +#define _PR_SI_ARCHITECTURE "arm" #endif #define PR_DLL_SUFFIX ".dylib" @@ -64,7 +67,7 @@ #undef HAVE_STACK_GROWING_UP #define HAVE_DLL -#ifdef __x86_64__ +#if defined(__x86_64__) || TARGET_OS_IPHONE #define USE_DLFCN #else #define USE_MACH_DYLD diff --git a/nsprpub/pr/include/prinit.h b/nsprpub/pr/include/prinit.h index 64abb344d406..e53b82143e1a 100644 --- a/nsprpub/pr/include/prinit.h +++ b/nsprpub/pr/include/prinit.h @@ -63,11 +63,11 @@ PR_BEGIN_EXTERN_C ** The format of the version string is ** ".[.] []" */ -#define PR_VERSION "4.8.9" +#define PR_VERSION "4.9 Beta" #define PR_VMAJOR 4 -#define PR_VMINOR 8 -#define PR_VPATCH 9 -#define PR_BETA PR_FALSE +#define PR_VMINOR 9 +#define PR_VPATCH 0 +#define PR_BETA PR_TRUE /* ** PRVersionCheck diff --git a/nsprpub/pr/include/prtypes.h b/nsprpub/pr/include/prtypes.h index be9f79d1da67..9cd5e257af67 100644 --- a/nsprpub/pr/include/prtypes.h +++ b/nsprpub/pr/include/prtypes.h @@ -343,6 +343,17 @@ typedef long PRInt32; ** architectures and even different compilers have varying support for ** 64 bit values. The only guaranteed portability requires the use of ** the LL_ macros (see prlong.h). +** +** MACROS: PR_INT64 +** PR_UINT64 +** DESCRIPTION: +** The PR_INT64 and PR_UINT64 macros provide a portable way for +** specifying 64-bit integer constants. They can only be used if +** PRInt64 and PRUint64 are defined as compiler-supported 64-bit +** integer types (i.e., if HAVE_LONG_LONG is defined, which is true +** for all the supported compilers topday). If PRInt64 and PRUint64 +** are defined as structs, the LL_INIT macro defined in prlong.h has +** to be used. ************************************************************************/ #ifdef HAVE_LONG_LONG /* Keep this in sync with prlong.h. */ @@ -354,12 +365,18 @@ typedef long PRInt32; #if PR_BYTES_PER_LONG == 8 && !defined(__APPLE__) typedef long PRInt64; typedef unsigned long PRUint64; +#define PR_INT64(x) x ## L +#define PR_UINT64(x) x ## UL #elif defined(WIN32) && !defined(__GNUC__) typedef __int64 PRInt64; typedef unsigned __int64 PRUint64; +#define PR_INT64(x) x ## i64 +#define PR_UINT64(x) x ## ui64 #else typedef long long PRInt64; typedef unsigned long long PRUint64; +#define PR_INT64(x) x ## LL +#define PR_UINT64(x) x ## ULL #endif /* PR_BYTES_PER_LONG == 8 */ #else /* !HAVE_LONG_LONG */ typedef struct { diff --git a/nsprpub/pr/src/md/unix/uxproces.c b/nsprpub/pr/src/md/unix/uxproces.c index 364301c8d53b..afb96b0fdb5f 100644 --- a/nsprpub/pr/src/md/unix/uxproces.c +++ b/nsprpub/pr/src/md/unix/uxproces.c @@ -48,7 +48,9 @@ #endif #if defined(DARWIN) +#if defined(HAVE_CRT_EXTERNS_H) #include +#endif #else PR_IMPORT_DATA(char **) environ; #endif @@ -185,11 +187,18 @@ ForkAndExec( if (NULL == childEnvp) { #ifdef DARWIN +#ifdef HAVE_CRT_EXTERNS_H childEnvp = *(_NSGetEnviron()); +#else + PR_DELETE(process); + PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); + return NULL; +#endif #else childEnvp = environ; #endif } + for (nEnv = 0; childEnvp[nEnv]; nEnv++) { } newEnvp = (char **) PR_MALLOC((nEnv + 2) * sizeof(char *)); diff --git a/nsprpub/pr/tests/vercheck.c b/nsprpub/pr/tests/vercheck.c index 70791e08a374..c3ac66d161ad 100644 --- a/nsprpub/pr/tests/vercheck.c +++ b/nsprpub/pr/tests/vercheck.c @@ -52,10 +52,9 @@ #include /* - * This release (4.8.9) is backward compatible with the + * This release (4.9) is backward compatible with the * 4.0.x, 4.1.x, 4.2.x, 4.3.x, 4.4.x, 4.5.x, 4.6.x, 4.7.x, - * 4.8, 4.8.1, 4.8.2, 4.8.3, 4.8.4, 4.8.5, 4.8.6, 4.8.7, and - * 4.8.8 releases. It, of course, is compatible with itself. + * and 4.8.x releases. It, of course, is compatible with itself. */ static char *compatible_version[] = { "4.0", "4.0.1", "4.1", "4.1.1", "4.1.2", "4.1.3", @@ -66,7 +65,8 @@ static char *compatible_version[] = { "4.7", "4.7.1", "4.7.2", "4.7.3", "4.7.4", "4.7.5", "4.7.6", "4.8", "4.8.1", "4.8.2", "4.8.3", "4.8.4", "4.8.5", - "4.8.6", "4.8.7", "4.8.8", PR_VERSION + "4.8.6", "4.8.7", "4.8.8", "4.8.9", + PR_VERSION }; /* @@ -81,8 +81,8 @@ static char *incompatible_version[] = { "3.0", "3.0.1", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.5", "3.5.1", - "4.8.10", - "4.9", "4.9.1", + "4.9.1", + "4.10", "4.10.1", "10.0", "11.1", "12.14.20" }; From fa3c2e7eb478b87c6db210ae441a12382826cabe Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Thu, 18 Aug 2011 10:25:36 -0400 Subject: [PATCH 03/15] Bug 555482: Allow resetting resizers by double-clicking on the resizer. r=Enn --- content/base/src/nsGkAtomList.h | 1 + layout/xul/base/src/nsResizerFrame.cpp | 188 +++++++++++++----- layout/xul/base/src/nsResizerFrame.h | 9 + .../xul/base/test/window_resizer_element.xul | 15 +- 4 files changed, 159 insertions(+), 54 deletions(-) diff --git a/content/base/src/nsGkAtomList.h b/content/base/src/nsGkAtomList.h index bc4a6dcc706c..bda60be0cded 100644 --- a/content/base/src/nsGkAtomList.h +++ b/content/base/src/nsGkAtomList.h @@ -70,6 +70,7 @@ GK_ATOM(mozeditorbogusnode, "_moz_editor_bogus_node") GK_ATOM(mozgeneratedcontentbefore, "_moz_generated_content_before") GK_ATOM(mozgeneratedcontentafter, "_moz_generated_content_after") GK_ATOM(mozgeneratedcontentimage, "_moz_generated_content_image") +GK_ATOM(_moz_original_size, "_moz_original_size") GK_ATOM(_moz_target, "_moz_target") GK_ATOM(_moz_type, "_moz-type") GK_ATOM(menuactive, "_moz-menuactive") diff --git a/layout/xul/base/src/nsResizerFrame.cpp b/layout/xul/base/src/nsResizerFrame.cpp index 38b345c34993..679d66af3549 100644 --- a/layout/xul/base/src/nsResizerFrame.cpp +++ b/layout/xul/base/src/nsResizerFrame.cpp @@ -61,6 +61,7 @@ #include "nsMenuPopupFrame.h" #include "nsIScreenManager.h" #include "mozilla/dom/Element.h" +#include "nsContentErrors.h" // @@ -253,59 +254,31 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext, appUnitsRect.height = mRect.height; nsIntRect cssRect = appUnitsRect.ToInsidePixels(nsPresContext::AppUnitsPerCSSPixel()); - nsAutoString widthstr, heightstr; - widthstr.AppendInt(cssRect.width); - heightstr.AppendInt(cssRect.height); + nsIntRect oldRect; + nsWeakFrame weakFrame(menuPopupFrame); + if (menuPopupFrame) { + nsCOMPtr widget; + menuPopupFrame->GetWidget(getter_AddRefs(widget)); + if (widget) + widget->GetScreenBounds(oldRect); - // for XUL elements, just set the width and height attributes. For - // other elements, set style.width and style.height - if (contentToResize->IsXUL()) { - nsIntRect oldRect; - nsWeakFrame weakFrame(menuPopupFrame); - if (menuPopupFrame) { - nsCOMPtr widget; - menuPopupFrame->GetWidget(getter_AddRefs(widget)); - if (widget) - widget->GetScreenBounds(oldRect); - - // convert the new rectangle into outer window coordinates - nsIntPoint clientOffset = widget->GetClientOffset(); - rect.x -= clientOffset.x; - rect.y -= clientOffset.y; - } - - // only set the property if the element could have changed in that direction - if (direction.mHorizontal) { - contentToResize->SetAttr(kNameSpaceID_None, nsGkAtoms::width, widthstr, PR_TRUE); - } - if (direction.mVertical) { - contentToResize->SetAttr(kNameSpaceID_None, nsGkAtoms::height, heightstr, PR_TRUE); - } - - if (weakFrame.IsAlive() && - (oldRect.x != rect.x || oldRect.y != rect.y) && - (!menuPopupFrame->IsAnchored() || - menuPopupFrame->PopupLevel() != ePopupLevelParent)) { - menuPopupFrame->MoveTo(rect.x, rect.y, PR_TRUE); - } + // convert the new rectangle into outer window coordinates + nsIntPoint clientOffset = widget->GetClientOffset(); + rect.x -= clientOffset.x; + rect.y -= clientOffset.y; } - else { - nsCOMPtr inlineStyleContent = - do_QueryInterface(contentToResize); - if (inlineStyleContent) { - nsCOMPtr decl; - inlineStyleContent->GetStyle(getter_AddRefs(decl)); - // only set the property if the element could have changed in that direction - if (direction.mHorizontal) { - widthstr.AppendLiteral("px"); - decl->SetProperty(NS_LITERAL_STRING("width"), widthstr, EmptyString()); - } - if (direction.mVertical) { - heightstr.AppendLiteral("px"); - decl->SetProperty(NS_LITERAL_STRING("height"), heightstr, EmptyString()); - } - } + SizeInfo sizeInfo, originalSizeInfo; + sizeInfo.width.AppendInt(cssRect.width); + sizeInfo.height.AppendInt(cssRect.height); + ResizeContent(contentToResize, direction, sizeInfo, &originalSizeInfo); + MaybePersistOriginalSize(contentToResize, originalSizeInfo); + + if (weakFrame.IsAlive() && + (oldRect.x != rect.x || oldRect.y != rect.y) && + (!menuPopupFrame->IsAnchored() || + menuPopupFrame->PopupLevel() != ePopupLevelParent)) { + menuPopupFrame->MoveTo(rect.x, rect.y, PR_TRUE); } } else { @@ -323,6 +296,25 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext, MouseClicked(aPresContext, aEvent); } break; + + case NS_MOUSE_DOUBLECLICK: + if (aEvent->eventStructType == NS_MOUSE_EVENT && + static_cast(aEvent)->button == nsMouseEvent::eLeftButton) + { + nsCOMPtr window; + nsIPresShell* presShell = aPresContext->GetPresShell(); + nsIContent* contentToResize = + GetContentToResize(presShell, getter_AddRefs(window)); + if (contentToResize) { + nsIFrame* frameToResize = contentToResize->GetPrimaryFrame(); + if (frameToResize && frameToResize->GetType() == nsGkAtoms::menuPopupFrame) + break; // Don't restore original sizing for menupopup frames until + // we handle screen constraints here. (Bug 357725) + + RestoreOriginalSize(contentToResize); + } + } + break; } if (!doDefault) @@ -418,6 +410,102 @@ nsResizerFrame::AdjustDimensions(PRInt32* aPos, PRInt32* aSize, } } +/* static */ void +nsResizerFrame::ResizeContent(nsIContent* aContent, const Direction& aDirection, + const SizeInfo& aSizeInfo, SizeInfo* aOriginalSizeInfo) +{ + // for XUL elements, just set the width and height attributes. For + // other elements, set style.width and style.height + if (aContent->IsXUL()) { + if (aOriginalSizeInfo) { + aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::width, + aOriginalSizeInfo->width); + aContent->GetAttr(kNameSpaceID_None, nsGkAtoms::height, + aOriginalSizeInfo->height); + } + // only set the property if the element could have changed in that direction + if (aDirection.mHorizontal) { + aContent->SetAttr(kNameSpaceID_None, nsGkAtoms::width, aSizeInfo.width, PR_TRUE); + } + if (aDirection.mVertical) { + aContent->SetAttr(kNameSpaceID_None, nsGkAtoms::height, aSizeInfo.height, PR_TRUE); + } + } + else { + nsCOMPtr inlineStyleContent = + do_QueryInterface(aContent); + if (inlineStyleContent) { + nsCOMPtr decl; + inlineStyleContent->GetStyle(getter_AddRefs(decl)); + + if (aOriginalSizeInfo) { + decl->GetPropertyValue(NS_LITERAL_STRING("width"), + aOriginalSizeInfo->width); + decl->GetPropertyValue(NS_LITERAL_STRING("height"), + aOriginalSizeInfo->height); + } + + // only set the property if the element could have changed in that direction + if (aDirection.mHorizontal) { + nsAutoString widthstr(aSizeInfo.width); + if (!widthstr.IsEmpty() && + !Substring(widthstr, widthstr.Length() - 2, 2).EqualsLiteral("px")) + widthstr.AppendLiteral("px"); + decl->SetProperty(NS_LITERAL_STRING("width"), widthstr, EmptyString()); + } + if (aDirection.mVertical) { + nsAutoString heightstr(aSizeInfo.height); + if (!heightstr.IsEmpty() && + !Substring(heightstr, heightstr.Length() - 2, 2).EqualsLiteral("px")) + heightstr.AppendLiteral("px"); + decl->SetProperty(NS_LITERAL_STRING("height"), heightstr, EmptyString()); + } + } + } +} + +/* static */ void +nsResizerFrame::SizeInfoDtorFunc(void *aObject, nsIAtom *aPropertyName, + void *aPropertyValue, void *aData) +{ + nsResizerFrame::SizeInfo *propertyValue = + static_cast(aPropertyValue); + delete propertyValue; +} + +/* static */ void +nsResizerFrame::MaybePersistOriginalSize(nsIContent* aContent, + const SizeInfo& aSizeInfo) +{ + nsresult rv; + + aContent->GetProperty(nsGkAtoms::_moz_original_size, &rv); + if (rv != NS_PROPTABLE_PROP_NOT_THERE) + return; + + nsAutoPtr sizeInfo(new SizeInfo(aSizeInfo)); + rv = aContent->SetProperty(nsGkAtoms::_moz_original_size, sizeInfo.get(), + &SizeInfoDtorFunc); + if (NS_SUCCEEDED(rv)) + sizeInfo.forget(); +} + +/* static */ void +nsResizerFrame::RestoreOriginalSize(nsIContent* aContent) +{ + nsresult rv; + SizeInfo* sizeInfo = + static_cast(aContent->GetProperty(nsGkAtoms::_moz_original_size, + &rv)); + if (NS_FAILED(rv)) + return; + + NS_ASSERTION(sizeInfo, "We set a null sizeInfo!?"); + Direction direction = {1, 1}; + ResizeContent(aContent, direction, *sizeInfo, nsnull); + aContent->DeleteProperty(nsGkAtoms::_moz_original_size); +} + /* returns a Direction struct containing the horizontal and vertical direction */ nsResizerFrame::Direction diff --git a/layout/xul/base/src/nsResizerFrame.h b/layout/xul/base/src/nsResizerFrame.h index 7212b1b480c9..e4d8c3d11be4 100644 --- a/layout/xul/base/src/nsResizerFrame.h +++ b/layout/xul/base/src/nsResizerFrame.h @@ -71,6 +71,15 @@ protected: static void AdjustDimensions(PRInt32* aPos, PRInt32* aSize, PRInt32 aMovement, PRInt8 aResizerDirection); + struct SizeInfo { + nsString width, height; + }; + static void SizeInfoDtorFunc(void *aObject, nsIAtom *aPropertyName, + void *aPropertyValue, void *aData); + static void ResizeContent(nsIContent* aContent, const Direction& aDirection, + const SizeInfo& aSizeInfo, SizeInfo* aOriginalSizeInfo); + static void MaybePersistOriginalSize(nsIContent* aContent, const SizeInfo& aSizeInfo); + static void RestoreOriginalSize(nsIContent* aContent); protected: nsIntRect mMouseDownRect; nsIntPoint mMouseDownPoint; diff --git a/layout/xul/base/test/window_resizer_element.xul b/layout/xul/base/test/window_resizer_element.xul index e760e7c02fdf..69c547b8030c 100644 --- a/layout/xul/base/test/window_resizer_element.xul +++ b/layout/xul/base/test/window_resizer_element.xul @@ -41,10 +41,17 @@ function testResizer(resizerid, noShrink, hResize, vResize, testid) " " + testid + " width moving " + mouseX + "," + mouseY + ",,," + hResize); is(Math.round(newrect.height), Math.round(expectedHeight), "resize element " + resizerid + " " + testid + " height moving " + mouseX + "," + mouseY); - // move it back before we release! - synthesizeMouse(document.documentElement, originalX + 5, originalY + 5, { type:"mousemove" }); - synthesizeMouse(document.documentElement, originalX + 5, originalY + 5, { type:"mouseup" }); - } + // release + synthesizeMouse(document.documentElement, originalX + 5 + mouseX * scale, + originalY + 5 + mouseY * scale, { type:"mouseup" }); } + // return to the original size + synthesizeMouse(document.documentElement, originalX + 5 + mouseX * scale, + originalY + 5 + mouseY * scale, { type:"dblclick" }); } + var newrect = document.getElementById(resizerid + "-container").getBoundingClientRect(); + is(Math.round(newrect.width), Math.round(rect.width), "resize element " + resizerid + + " " + testid + " doubleclicking to restore original size"); + is(Math.round(newrect.height), Math.round(rect.height), "resize element " + resizerid + + " " + testid + " doubleclicking to restore original size"); } } From f2d90aaa62d1b0720413e7aa393397619839b9f8 Mon Sep 17 00:00:00 2001 From: Steven Michaud Date: Thu, 18 Aug 2011 15:39:54 -0500 Subject: [PATCH 04/15] Bug 678607 - Work around Apple bug to avoid crashing with two-finger swipe on OS X Lion. r=bgirard --- widget/src/cocoa/nsChildView.mm | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/widget/src/cocoa/nsChildView.mm b/widget/src/cocoa/nsChildView.mm index fc5668edbee5..05a50cc1d9fc 100644 --- a/widget/src/cocoa/nsChildView.mm +++ b/widget/src/cocoa/nsChildView.mm @@ -306,6 +306,15 @@ nsresult nsChildView::Create(nsIWidget *aParent, if (!gChildViewMethodsSwizzled) { nsToolkit::SwizzleMethods([NSView class], @selector(mouseDownCanMoveWindow), @selector(nsChildView_NSView_mouseDownCanMoveWindow)); +#ifdef __LP64__ + if (nsToolkit::OnLionOrLater()) { + nsToolkit::SwizzleMethods([NSEvent class], @selector(addLocalMonitorForEventsMatchingMask:handler:), + @selector(nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:handler:), + PR_TRUE); + nsToolkit::SwizzleMethods([NSEvent class], @selector(removeMonitor:), + @selector(nsChildView_NSEvent_removeMonitor:), PR_TRUE); + } +#endif #ifndef NP_NO_CARBON TextInputHandler::SwizzleMethods(); #endif @@ -5092,3 +5101,48 @@ ChildViewMouseTracker::WindowAcceptsEvent(NSWindow* aWindow, NSEvent* aEvent, } @end + +#ifdef __LP64__ +// When using blocks, at least on OS X 10.7, the OS sometimes calls +// +[NSEvent removeMonitor:] more than once on a single event monitor, which +// causes crashes. See bug 678607. We hook these methods to work around +// the problem. +@interface NSEvent (MethodSwizzling) ++ (id)nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:(unsigned long long)mask handler:(id)block; ++ (void)nsChildView_NSEvent_removeMonitor:(id)eventMonitor; +@end + +// This is a local copy of the AppKit frameworks sEventObservers hashtable. +// It only stores "local monitors". We use it to ensure that +[NSEvent +// removeMonitor:] is never called more than once on the same local monitor. +static NSHashTable *sLocalEventObservers = nil; + +@implementation NSEvent (MethodSwizzling) + ++ (id)nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:(unsigned long long)mask handler:(id)block +{ + if (!sLocalEventObservers) { + sLocalEventObservers = [[NSHashTable hashTableWithOptions: + NSHashTableStrongMemory | NSHashTableObjectPointerPersonality] retain]; + } + id retval = + [self nsChildView_NSEvent_addLocalMonitorForEventsMatchingMask:mask handler:block]; + if (sLocalEventObservers && retval && ![sLocalEventObservers containsObject:retval]) { + [sLocalEventObservers addObject:retval]; + } + return retval; +} + ++ (void)nsChildView_NSEvent_removeMonitor:(id)eventMonitor +{ + if (sLocalEventObservers && [eventMonitor isKindOfClass: ::NSClassFromString(@"_NSLocalEventObserver")]) { + if (![sLocalEventObservers containsObject:eventMonitor]) { + return; + } + [sLocalEventObservers removeObject:eventMonitor]; + } + [self nsChildView_NSEvent_removeMonitor:eventMonitor]; +} + +@end +#endif // #ifdef __LP64__ From bc3a53d6326c73db0cf5cd0586e8e9327585131d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Fri, 19 Aug 2011 11:07:08 +0200 Subject: [PATCH 05/15] Backed out changeset e68b6ce72fc3 --- browser/base/content/tabview/storage.js | 17 --- browser/base/content/tabview/ui.js | 47 ++++---- .../test/tabview/browser_tabview_bug597248.js | 15 ++- .../browser_tabview_privatebrowsing.js | 4 - browser/base/content/test/tabview/head.js | 5 +- .../sessionstore/src/nsSessionStore.js | 53 ++-------- .../sessionstore/test/browser/Makefile.in | 1 - .../browser/browser_595601-restore_hidden.js | 100 +++++++++--------- .../test/browser/browser_662812.js | 34 ------ 9 files changed, 87 insertions(+), 189 deletions(-) delete mode 100644 browser/components/sessionstore/test/browser/browser_662812.js diff --git a/browser/base/content/tabview/storage.js b/browser/base/content/tabview/storage.js index 5af35d22f7a2..2fdc448b11b6 100644 --- a/browser/base/content/tabview/storage.js +++ b/browser/base/content/tabview/storage.js @@ -184,23 +184,6 @@ let Storage = { return existingData; }, - // ---------- - // Function: readWindowBusyState - // Returns the current busyState for the given window. - readWindowBusyState: function Storage_readWindowBusyState(win) { - let state; - - try { - let data = this._sessionStore.getWindowState(win); - if (data) - state = JSON.parse(data); - } catch (e) { - Utils.log("Error while parsing window state"); - } - - return (state && state.windows[0].busy); - }, - // ---------- // Function: saveGroupItemsData // Saves the global data for the singleton for the given window. diff --git a/browser/base/content/tabview/ui.js b/browser/base/content/tabview/ui.js index b0b1071fddf7..d9e18083bd0a 100644 --- a/browser/base/content/tabview/ui.js +++ b/browser/base/content/tabview/ui.js @@ -123,9 +123,9 @@ let UI = { wasInTabView: false }, - // Variable: _storageBusy - // Tells whether the storage is currently busy or not. - _storageBusy: false, + // Variable: _storageBusyCount + // Used to keep track of how many calls to storageBusy vs storageReady. + _storageBusyCount: 0, // Variable: isDOMWindowClosing // Tells wether the parent window is about to close @@ -169,10 +169,6 @@ let UI = { // ___ storage Storage.init(); - - if (Storage.readWindowBusyState(gWindow)) - this.storageBusy(); - let data = Storage.readUIData(gWindow); this._storageSanity(data); this._pageBounds = data.pageBounds; @@ -616,13 +612,12 @@ let UI = { // Pauses the storage activity that conflicts with sessionstore updates and // private browsing mode switches. Calls can be nested. storageBusy: function UI_storageBusy() { - if (this._storageBusy) - return; - - this._storageBusy = true; - - TabItems.pauseReconnecting(); - GroupItems.pauseAutoclose(); + if (!this._storageBusyCount) { + TabItems.pauseReconnecting(); + GroupItems.pauseAutoclose(); + } + + this._storageBusyCount++; }, // ---------- @@ -630,18 +625,16 @@ let UI = { // Resumes the activity paused by storageBusy, and updates for any new group // information in sessionstore. Calls can be nested. storageReady: function UI_storageReady() { - if (!this._storageBusy) - return; - - this._storageBusy = false; - - let hasGroupItemsData = GroupItems.load(); - if (!hasGroupItemsData) - this.reset(); - - TabItems.resumeReconnecting(); - GroupItems._updateTabBar(); - GroupItems.resumeAutoclose(); + this._storageBusyCount--; + if (!this._storageBusyCount) { + let hasGroupItemsData = GroupItems.load(); + if (!hasGroupItemsData) + this.reset(); + + TabItems.resumeReconnecting(); + GroupItems._updateTabBar(); + GroupItems.resumeAutoclose(); + } }, // ---------- @@ -737,7 +730,7 @@ let UI = { } else { // If we're currently in the process of entering private browsing, // we don't want to go to the Tab View UI. - if (self._storageBusy) + if (self._storageBusyCount) return; // if not closing the last tab diff --git a/browser/base/content/test/tabview/browser_tabview_bug597248.js b/browser/base/content/test/tabview/browser_tabview_bug597248.js index 1def8ee014d9..9855c1ecb07f 100644 --- a/browser/base/content/test/tabview/browser_tabview_bug597248.js +++ b/browser/base/content/test/tabview/browser_tabview_bug597248.js @@ -37,20 +37,26 @@ function setupTwo(win) { contentWindow.TabItems.update(tabItem.tab); tabItem.addSubscriber("savedCachedImageData", function onSaved(item) { item.removeSubscriber("savedCachedImageData", onSaved); - - if (!--numTabsToSave) - restoreWindow(); + --numTabsToSave; }); }); // after the window is closed, restore it. - let restoreWindow = function() { + let xulWindowDestory = function() { + Services.obs.removeObserver( + xulWindowDestory, "xul-window-destroyed", false); + + // "xul-window-destroyed" is just fired just before a XUL window is + // destroyed so restore window and test it after a delay executeSoon(function() { restoredWin = undoCloseWindow(); restoredWin.addEventListener("load", function onLoad(event) { restoredWin.removeEventListener("load", onLoad, false); registerCleanupFunction(function() restoredWin.close()); + + // ensure that closed tabs have been saved + is(numTabsToSave, 0, "All tabs were saved when window was closed."); is(restoredWin.gBrowser.tabs.length, 3, "The total number of tabs is 3"); // setup tab variables and listen to the tabs load progress @@ -97,6 +103,7 @@ function setupTwo(win) { }, false); }); }; + Services.obs.addObserver(xulWindowDestory, "xul-window-destroyed", false); win.close(); } diff --git a/browser/base/content/test/tabview/browser_tabview_privatebrowsing.js b/browser/base/content/test/tabview/browser_tabview_privatebrowsing.js index b0ef3cd242ae..7b92287a356a 100644 --- a/browser/base/content/test/tabview/browser_tabview_privatebrowsing.js +++ b/browser/base/content/test/tabview/browser_tabview_privatebrowsing.js @@ -49,15 +49,11 @@ function onTabViewLoadedAndShown() { groupTitles[a] = gi.getTitle(); } - contentWindow.gPrefBranch.setBoolPref("animate_zoom", false); - // Create a second tab gBrowser.addTab("about:robots"); is(gBrowser.tabs.length, 2, "we now have 2 tabs"); - registerCleanupFunction(function() { gBrowser.removeTab(gBrowser.tabs[1]); - contentWindow.gPrefBranch.clearUserPref("animate_zoom"); }); afterAllTabsLoaded(function() { diff --git a/browser/base/content/test/tabview/head.js b/browser/base/content/test/tabview/head.js index 5940f726764b..90de72fa3728 100644 --- a/browser/base/content/test/tabview/head.js +++ b/browser/base/content/test/tabview/head.js @@ -361,10 +361,7 @@ function togglePrivateBrowsing(callback) { Services.obs.addObserver(function observe() { Services.obs.removeObserver(observe, topic); - - // use executeSoon() to let Panorama load its group data from the session - // before we call afterAllTabsLoaded() - executeSoon(function () afterAllTabsLoaded(callback)); + afterAllTabsLoaded(callback); }, topic, false); let pb = Cc["@mozilla.org/privatebrowsing;1"]. diff --git a/browser/components/sessionstore/src/nsSessionStore.js b/browser/components/sessionstore/src/nsSessionStore.js index 23ddcc9c3d16..92c69da1eba7 100644 --- a/browser/components/sessionstore/src/nsSessionStore.js +++ b/browser/components/sessionstore/src/nsSessionStore.js @@ -785,7 +785,7 @@ SessionStoreService.prototype = { aWindow.__SSi = "window" + Date.now(); // and create its data object - this._windows[aWindow.__SSi] = { tabs: [], selected: 0, _closedTabs: [], busy: false }; + this._windows[aWindow.__SSi] = { tabs: [], selected: 0, _closedTabs: [] }; if (!this._isWindowLoaded(aWindow)) this._windows[aWindow.__SSi]._restoring = true; if (!aWindow.toolbar.visible) @@ -969,9 +969,6 @@ SessionStoreService.prototype = { // save the window if it has multiple tabs or a single saveable tab if (winData.tabs.length > 1 || (winData.tabs.length == 1 && this._shouldSaveTabState(winData.tabs[0]))) { - // we don't want to save the busy state - delete winData.busy; - this._closedWindows.unshift(winData); this._capClosedWindows(); } @@ -1268,7 +1265,7 @@ SessionStoreService.prototype = { throw (Components.returnCode = Cr.NS_ERROR_INVALID_ARG); var window = aTab.ownerDocument.defaultView; - this._setWindowStateBusy(window); + this._sendWindowStateEvent(window, "Busy"); this.restoreHistoryPrecursor(window, [aTab], [tabState], 0, 0, 0); }, @@ -1284,7 +1281,7 @@ SessionStoreService.prototype = { tabState.index = Math.max(1, Math.min(tabState.index, tabState.entries.length)); tabState.pinned = false; - this._setWindowStateBusy(aWindow); + this._sendWindowStateEvent(aWindow, "Busy"); let newTab = aTab == aWindow.gBrowser.selectedTab ? aWindow.gBrowser.addTab(null, {relatedToCurrent: true, ownerTab: aTab}) : aWindow.gBrowser.addTab(); @@ -1327,7 +1324,7 @@ SessionStoreService.prototype = { let closedTab = closedTabs.splice(aIndex, 1).shift(); let closedTabState = closedTab.state; - this._setWindowStateBusy(aWindow); + this._sendWindowStateEvent(aWindow, "Busy"); // create a new tab let browser = aWindow.gBrowser; let tab = browser.addTab(); @@ -2537,7 +2534,7 @@ SessionStoreService.prototype = { // We're not returning from this before we end up calling restoreHistoryPrecursor // for this window, so make sure we send the SSWindowStateBusy event. - this._setWindowStateBusy(aWindow); + this._sendWindowStateEvent(aWindow, "Busy"); if (root._closedWindows) this._closedWindows = root._closedWindows; @@ -2724,7 +2721,7 @@ SessionStoreService.prototype = { if (aTabs.length == 0) { // this is normally done in restoreHistory() but as we're returning early // here we need to take care of it. - this._setWindowStateReady(aWindow); + this._sendWindowStateEvent(aWindow, "Ready"); return; } @@ -2869,7 +2866,7 @@ SessionStoreService.prototype = { if (aTabs.length == 0) { // At this point we're essentially ready for consumers to read/write data // via the sessionstore API so we'll send the SSWindowStateReady event. - this._setWindowStateReady(aWindow); + this._sendWindowStateEvent(aWindow, "Ready"); return; // no more tabs to restore } @@ -4014,42 +4011,6 @@ SessionStoreService.prototype = { this._restoreCount = -1; }, - /** - * Set the given window's busy state - * @param aWindow the window - * @param aValue the window's busy state - */ - _setWindowStateBusyValue: - function sss__changeWindowStateBusyValue(aWindow, aValue) { - - this._windows[aWindow.__SSi].busy = aValue; - - // Keep the to-be-restored state in sync because that is returned by - // getWindowState() as long as the window isn't loaded, yet. - if (!this._isWindowLoaded(aWindow)) { - let stateToRestore = this._statesToRestore[aWindow.__SS_restoreID].windows[0]; - stateToRestore.busy = aValue; - } - }, - - /** - * Set the given window's state to 'not busy'. - * @param aWindow the window - */ - _setWindowStateReady: function sss__setWindowStateReady(aWindow) { - this._setWindowStateBusyValue(aWindow, false); - this._sendWindowStateEvent(aWindow, "Ready"); - }, - - /** - * Set the given window's state to 'busy'. - * @param aWindow the window - */ - _setWindowStateBusy: function sss__setWindowStateBusy(aWindow) { - this._setWindowStateBusyValue(aWindow, true); - this._sendWindowStateEvent(aWindow, "Busy"); - }, - /** * Dispatch an SSWindowState_____ event for the given window. * @param aWindow the window diff --git a/browser/components/sessionstore/test/browser/Makefile.in b/browser/components/sessionstore/test/browser/Makefile.in index 2f80d4349231..e0f4ff44f321 100644 --- a/browser/components/sessionstore/test/browser/Makefile.in +++ b/browser/components/sessionstore/test/browser/Makefile.in @@ -151,7 +151,6 @@ _BROWSER_TEST_FILES = \ browser_636279.js \ browser_645428.js \ browser_659591.js \ - browser_662812.js \ $(NULL) ifneq ($(OS_ARCH),Darwin) diff --git a/browser/components/sessionstore/test/browser/browser_595601-restore_hidden.js b/browser/components/sessionstore/test/browser/browser_595601-restore_hidden.js index 3971a51d2a29..3e9f8b351b58 100644 --- a/browser/components/sessionstore/test/browser/browser_595601-restore_hidden.js +++ b/browser/components/sessionstore/test/browser/browser_595601-restore_hidden.js @@ -4,6 +4,8 @@ const TAB_STATE_NEEDS_RESTORE = 1; const TAB_STATE_RESTORING = 2; +let stateBackup = ss.getBrowserState(); + let state = {windows:[{tabs:[ {entries:[{url:"http://example.com#1"}]}, {entries:[{url:"http://example.com#2"}]}, @@ -20,12 +22,20 @@ function test() { registerCleanupFunction(function () { Services.prefs.clearUserPref("browser.sessionstore.restore_hidden_tabs"); + + TabsProgressListener.uninit(); + + ss.setBrowserState(stateBackup); }); + TabsProgressListener.init(); + // First stage: restoreHiddenTabs = true // Second stage: restoreHiddenTabs = false test_loadTabs(true, function () { - test_loadTabs(false, finish); + test_loadTabs(false, function () { + waitForFocus(finish); + }); }); } @@ -33,9 +43,10 @@ function test_loadTabs(restoreHiddenTabs, callback) { Services.prefs.setBoolPref("browser.sessionstore.restore_hidden_tabs", restoreHiddenTabs); let expectedTabs = restoreHiddenTabs ? 8 : 4; + let firstProgress = true; - newWindowWithState(state, function (win, needsRestore, isRestoring) { + TabsProgressListener.setCallback(function (needsRestore, isRestoring) { if (firstProgress) { firstProgress = false; is(isRestoring, 3, "restoring 3 tabs concurrently"); @@ -43,75 +54,60 @@ function test_loadTabs(restoreHiddenTabs, callback) { ok(isRestoring < 4, "restoring max. 3 tabs concurrently"); } - if (win.gBrowser.tabs.length - needsRestore == expectedTabs) { - is(win.gBrowser.visibleTabs.length, 4, "only 4 visible tabs"); - - TabsProgressListener.uninit(); + if (gBrowser.tabs.length - needsRestore == expectedTabs) { + TabsProgressListener.unsetCallback(); + is(gBrowser.visibleTabs.length, 4, "only 4 visible tabs"); callback(); } }); + + ss.setBrowserState(JSON.stringify(state)); +} + +function countTabs() { + let needsRestore = 0, isRestoring = 0; + let windowsEnum = Services.wm.getEnumerator("navigator:browser"); + + while (windowsEnum.hasMoreElements()) { + let window = windowsEnum.getNext(); + if (window.closed) + continue; + + for (let i = 0; i < window.gBrowser.tabs.length; i++) { + let browser = window.gBrowser.tabs[i].linkedBrowser; + if (browser.__SS_restoreState == TAB_STATE_RESTORING) + isRestoring++; + else if (browser.__SS_restoreState == TAB_STATE_NEEDS_RESTORE) + needsRestore++; + } + } + + return [needsRestore, isRestoring]; } let TabsProgressListener = { - init: function (win) { - this.window = win; - - this.window.gBrowser.addTabsProgressListener(this); + init: function () { + gBrowser.addTabsProgressListener(this); }, uninit: function () { - this.window.gBrowser.removeTabsProgressListener(this); - - delete this.window; - delete this.callback; + this.unsetCallback(); + gBrowser.removeTabsProgressListener(this); }, setCallback: function (callback) { this.callback = callback; }, + unsetCallback: function () { + delete this.callback; + }, + onStateChange: function (aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) { if (this.callback && aBrowser.__SS_restoreState == TAB_STATE_RESTORING && aStateFlags & Ci.nsIWebProgressListener.STATE_STOP && aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK && aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW) - this.callback.apply(null, [this.window].concat(this.countTabs())); - }, - - countTabs: function () { - let needsRestore = 0, isRestoring = 0; - - for (let i = 0; i < this.window.gBrowser.tabs.length; i++) { - let browser = this.window.gBrowser.tabs[i].linkedBrowser; - if (browser.__SS_restoreState == TAB_STATE_RESTORING) - isRestoring++; - else if (browser.__SS_restoreState == TAB_STATE_NEEDS_RESTORE) - needsRestore++; - } - - return [needsRestore, isRestoring]; + this.callback.apply(null, countTabs()); } } - -// ---------- -function whenWindowLoaded(win, callback) { - win.addEventListener("load", function onLoad() { - win.removeEventListener("load", onLoad, false); - executeSoon(callback); - }, false); -} - -// ---------- -function newWindowWithState(state, callback) { - let opts = "chrome,all,dialog=no,height=800,width=800"; - let win = window.openDialog(getBrowserURL(), "_blank", opts); - - registerCleanupFunction(function () win.close()); - - whenWindowLoaded(win, function () { - TabsProgressListener.init(win); - TabsProgressListener.setCallback(callback); - - ss.setWindowState(win, JSON.stringify(state), true); - }); -} diff --git a/browser/components/sessionstore/test/browser/browser_662812.js b/browser/components/sessionstore/test/browser/browser_662812.js deleted file mode 100644 index 44cfe7ba3e72..000000000000 --- a/browser/components/sessionstore/test/browser/browser_662812.js +++ /dev/null @@ -1,34 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -function test() { - waitForExplicitFinish(); - - window.addEventListener("SSWindowStateBusy", function onBusy() { - window.removeEventListener("SSWindowStateBusy", onBusy, false); - - let state = JSON.parse(ss.getWindowState(window)); - ok(state.windows[0].busy, "window is busy"); - - window.addEventListener("SSWindowStateReady", function onReady() { - window.removeEventListener("SSWindowStateReady", onReady, false); - - let state = JSON.parse(ss.getWindowState(window)); - ok(!state.windows[0].busy, "window is not busy"); - - gBrowser.removeTab(gBrowser.tabs[1]); - executeSoon(finish); - }, false); - }, false); - - // create a new tab - let tab = gBrowser.addTab("about:mozilla"); - let browser = tab.linkedBrowser; - - // close and restore it - browser.addEventListener("load", function onLoad() { - browser.removeEventListener("load", onLoad, true); - gBrowser.removeTab(tab); - ss.undoCloseTab(window, 0); - }, true); -} From 5476f2d8906c07b955b1c84a096eaf7f7be1ca9e Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Fri, 19 Aug 2011 11:39:00 -0400 Subject: [PATCH 06/15] Bug 679864 - [1/4] Upgrade WebGL conformance test suite to r15318 - r=trust.me This is the actual upgrade. The canonical URL for this test suite is https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/ --- content/canvas/test/webgl/00_test_list.txt | 1 + content/canvas/test/webgl/README.mozilla | 6 +- .../test/webgl/conformance/00_test_list.txt | 20 +- .../webgl/conformance/array-buffer-crash.html | 7 +- .../conformance/array-buffer-view-crash.html | 7 +- .../webgl/conformance/array-unit-tests.html | 43 +- .../webgl/conformance/bad-arguments-test.html | 4 +- .../webgl/conformance/buffer-bind-test.html | 10 +- .../conformance/buffer-data-array-buffer.html | 4 +- .../conformance/buffer-offscreen-test.html | 92 ++++ .../conformance/buffer-preserve-test.html | 65 ++- .../test/webgl/conformance/canvas-test.html | 9 +- .../webgl/conformance/canvas-zero-size.html | 42 ++ .../test/webgl/conformance/constants.html | 7 +- ...ributes-alpha-depth-stencil-antialias.html | 69 +-- .../conformance/context-lost-restored.html | 74 +++- .../test/webgl/conformance/context-lost.html | 11 +- .../webgl/conformance/context-type-test.html | 14 +- .../copy-tex-image-and-sub-image-2d.html | 4 +- .../draw-arrays-out-of-bounds.html | 4 +- .../draw-elements-out-of-bounds.html | 4 +- .../drawingbuffer-static-canvas-test.html | 61 +++ .../webgl/conformance/drawingbuffer-test.html | 60 +++ .../webgl/conformance/error-reporting.html | 4 +- .../framebuffer-object-attachment.html | 162 +++++--- .../webgl/conformance/framebuffer-test.html | 9 +- .../webgl/conformance/get-active-test.html | 5 +- .../gl-bind-attrib-location-test.html | 12 +- .../test/webgl/conformance/gl-clear.html | 6 +- .../webgl/conformance/gl-drawelements.html | 10 +- .../conformance/gl-enable-enum-test.html | 10 +- .../conformance/gl-enable-vertex-attrib.html | 7 +- .../test/webgl/conformance/gl-enum-tests.html | 10 +- .../test/webgl/conformance/gl-fragcoord.html | 84 ++++ .../conformance/gl-get-active-attribute.html | 10 +- .../conformance/gl-get-active-uniform.html | 10 +- .../test/webgl/conformance/gl-get-calls.html | 10 +- .../test/webgl/conformance/gl-geterror.html | 77 ++++ .../webgl/conformance/gl-getshadersource.html | 12 +- .../test/webgl/conformance/gl-getstring.html | 10 +- .../webgl/conformance/gl-min-attribs.html | 11 +- .../conformance/gl-min-textures-unroll.html | 86 ---- .../webgl/conformance/gl-min-textures.html | 12 +- .../webgl/conformance/gl-min-uniforms.html | 14 +- .../conformance/gl-object-get-calls.html | 8 +- .../webgl/conformance/gl-pixelstorei.html | 10 +- .../webgl/conformance/gl-scissor-test.html | 10 +- .../webgl/conformance/gl-shader-test.html | 10 +- .../test/webgl/conformance/gl-teximage.html | 6 +- .../webgl/conformance/gl-uniform-arrays.html | 12 +- .../webgl/conformance/gl-uniform-bool.html | 10 +- .../conformance/gl-uniformmatrix4fv.html | 7 +- .../webgl/conformance/gl-unknown-uniform.html | 10 +- .../gl-vertex-attrib-zero-issues.html | 6 +- .../webgl/conformance/gl-vertex-attrib.html | 7 +- .../gl-vertexattribpointer-offsets.html | 192 +++++++++ .../conformance/gl-vertexattribpointer.html | 10 +- .../glsl-2types-of-textures-on-same-unit.html | 15 +- .../webgl/conformance/glsl-conformance.html | 393 ++++++++++++++---- .../test/webgl/conformance/glsl-features.html | 234 +++++++++++ .../conformance/glsl-long-variable-names.html | 130 ++++++ .../incorrect-context-object-behaviour.html | 4 +- .../index-validation-copies-indices.html | 4 +- ...validation-crash-with-buffer-sub-data.html | 4 +- ...-validation-verifies-too-many-indices.html | 4 +- .../index-validation-with-resized-buffer.html | 6 +- .../webgl/conformance/index-validation.html | 4 +- .../webgl/conformance/instanceof-test.html | 12 +- .../webgl/conformance/invalid-UTF-16.html | 4 +- .../conformance/invalid-passed-params.html | 6 +- .../test/webgl/conformance/is-object.html | 2 + .../test/webgl/conformance/methods.html | 7 +- .../conformance/more-than-65536-points.html | 8 +- .../webgl/conformance/more/00_test_list.txt | 2 +- .../webgl/conformance/more/all_tests.html | 3 +- .../conformance/more/all_tests_linkonly.html | 3 +- .../more/all_tests_sequential.html | 3 +- .../conformance/badArgsArityLessThanArgc.html | 6 +- .../more/conformance/constants.html | 6 +- .../more/conformance/fuzzTheAPI.html | 4 +- .../more/conformance/getContext.html | 4 +- .../conformance/more/conformance/methods.html | 6 +- .../more/conformance/quickCheckAPI.html | 4 +- .../conformance/quickCheckAPIBadArgs.html | 4 +- .../more/conformance/webGLArrays.html | 9 +- .../conformance/more/demos/opengl_web.html | 51 +-- .../webgl/conformance/more/demos/video.html | 6 +- .../more/functions/bindBuffer.html | 6 +- .../more/functions/bindBufferBadArgs.html | 6 +- .../bindFramebufferLeaveNonZero.html | 4 +- .../more/functions/bufferData.html | 4 +- .../more/functions/bufferDataBadArgs.html | 4 +- .../more/functions/bufferSubData.html | 4 +- .../more/functions/bufferSubDataBadArgs.html | 4 +- .../more/functions/copyTexImage2D.html | 11 +- .../more/functions/copyTexImage2DBadArgs.html | 6 +- .../more/functions/copyTexSubImage2D.html | 11 +- .../functions/copyTexSubImage2DBadArgs.html | 6 +- .../more/functions/deleteBufferBadArgs.html | 4 +- .../more/functions/drawArrays.html | 11 +- .../more/functions/drawArraysOutOfBounds.html | 11 +- .../more/functions/drawElements.html | 11 +- .../more/functions/drawElementsBadArgs.html | 11 +- .../conformance/more/functions/isTests.html | 6 +- .../more/functions/readPixels.html | 6 +- .../more/functions/readPixelsBadArgs.html | 21 +- .../more/functions/texImage2D.html | 6 +- .../more/functions/texImage2DBadArgs.html | 6 +- .../more/functions/texImage2DHTML.html | 19 +- .../more/functions/texImage2DHTMLBadArgs.html | 4 +- .../more/functions/texSubImage2D.html | 6 +- .../more/functions/texSubImage2DBadArgs.html | 6 +- .../more/functions/texSubImage2DHTML.html | 25 +- .../functions/texSubImage2DHTMLBadArgs.html | 4 +- .../more/functions/uniformMatrix.html | 8 +- .../more/functions/uniformMatrixBadArgs.html | 8 +- .../conformance/more/functions/uniformf.html | 9 +- .../more/functions/uniformfArrayLen1.html | 9 +- .../more/functions/uniformfBadArgs.html | 9 +- .../conformance/more/functions/uniformi.html | 9 +- .../more/functions/uniformiBadArgs.html | 8 +- .../more/functions/vertexAttrib.html | 11 +- .../more/functions/vertexAttribBadArgs.html | 11 +- .../more/functions/vertexAttribPointer.html | 11 +- .../functions/vertexAttribPointerBadArgs.html | 11 +- .../more/glsl/arrayOutOfBounds.html | 36 +- .../conformance/more/glsl/longLoops.html | 35 +- .../more/glsl/uniformOutOfBounds.html | 36 +- .../more/glsl/unusedAttribsUniforms.html | 16 +- .../test/webgl/conformance/more/index.html | 1 + .../more/performance/CPUvsGPU.html | 21 +- .../more/performance/bandwidth.html | 16 +- .../more/performance/jsGCPause.html | 4 +- .../more/performance/jsMatrixMult.html | 4 +- .../more/performance/jsToGLOverhead.html | 4 +- .../test/webgl/conformance/more/unit.js | 2 +- .../test/webgl/conformance/more/util.js | 2 +- .../conformance/null-object-behaviour.html | 4 +- .../conformance/null-uniform-location.html | 4 +- .../object-deletion-behaviour.html | 10 +- .../conformance/oes-standard-derivatives.html | 11 +- .../webgl/conformance/oes-texture-float.html | 15 +- .../conformance/oes-vertex-array-object.html | 7 +- .../conformance/origin-clean-conformance.html | 100 +++-- .../test/webgl/conformance/point-size.html | 6 +- .../conformance/premultiplyalpha-test.html | 143 +++++++ .../test/webgl/conformance/program-test.html | 15 +- .../read-pixels-pack-alignment.html | 6 +- .../webgl/conformance/read-pixels-test.html | 7 +- .../renderbuffer-initialization.html | 4 +- .../conformance/resource-sharing-test.html | 11 +- .../conformance/resources/fragmentShader.frag | 4 - .../conformance/resources/npot-video.mp4 | Bin 0 -> 38215 bytes .../resources/npot-video.theora.ogv | Bin 0 -> 24630 bytes .../resources/npot-video.webmvp8.webm | Bin 0 -> 51240 bytes .../conformance/resources/vertexShader.vert | 5 - .../conformance/resources/webgl-test-utils.js | 49 ++- .../webgl/conformance/resources/webgl-test.js | 4 +- .../conformance/shaders/00_test_list.txt | 2 + .../shaders/glsl-features/00_test_list.txt | 48 +++ .../shaders/glsl-features/abs-ref.frag | 23 + .../shaders/glsl-features/abs-ref.vert | 32 ++ .../shaders/glsl-features/abs-vec2-ref.frag | 28 ++ .../shaders/glsl-features/abs-vec2-ref.vert | 37 ++ .../shaders/glsl-features/abs-vec2.frag | 18 + .../shaders/glsl-features/abs-vec2.vert | 27 ++ .../shaders/glsl-features/abs-vec3-ref.frag | 28 ++ .../shaders/glsl-features/abs-vec3-ref.vert | 37 ++ .../shaders/glsl-features/abs-vec3.frag | 17 + .../shaders/glsl-features/abs-vec3.vert | 26 ++ .../shaders/glsl-features/abs-vec4-ref.frag | 27 ++ .../shaders/glsl-features/abs-vec4-ref.vert | 36 ++ .../shaders/glsl-features/abs-vec4.frag | 15 + .../shaders/glsl-features/abs-vec4.vert | 24 ++ .../shaders/glsl-features/abs.frag | 19 + .../shaders/glsl-features/abs.vert | 28 ++ .../shaders/glsl-features/base.frag | 15 + .../shaders/glsl-features/base.vert | 21 + .../shaders/glsl-features/ceil-ref.frag | 24 ++ .../shaders/glsl-features/ceil-ref.vert | 33 ++ .../shaders/glsl-features/ceil-vec2-ref.frag | 30 ++ .../shaders/glsl-features/ceil-vec2-ref.vert | 38 ++ .../shaders/glsl-features/ceil-vec2.frag | 18 + .../shaders/glsl-features/ceil-vec2.vert | 27 ++ .../shaders/glsl-features/ceil-vec3-ref.frag | 31 ++ .../shaders/glsl-features/ceil-vec3-ref.vert | 38 ++ .../shaders/glsl-features/ceil-vec3.frag | 18 + .../shaders/glsl-features/ceil-vec3.vert | 26 ++ .../shaders/glsl-features/ceil-vec4-ref.frag | 31 ++ .../shaders/glsl-features/ceil-vec4-ref.vert | 38 ++ .../shaders/glsl-features/ceil-vec4.frag | 17 + .../shaders/glsl-features/ceil-vec4.vert | 25 ++ .../shaders/glsl-features/ceil.frag | 18 + .../shaders/glsl-features/ceil.vert | 28 ++ .../shaders/glsl-features/floor-ref.frag | 23 + .../shaders/glsl-features/floor-ref.vert | 32 ++ .../shaders/glsl-features/floor-vec2-ref.frag | 29 ++ .../shaders/glsl-features/floor-vec2-ref.vert | 37 ++ .../shaders/glsl-features/floor-vec2.frag | 18 + .../shaders/glsl-features/floor-vec2.vert | 27 ++ .../shaders/glsl-features/floor-vec3-ref.frag | 30 ++ .../shaders/glsl-features/floor-vec3-ref.vert | 37 ++ .../shaders/glsl-features/floor-vec3.frag | 18 + .../shaders/glsl-features/floor-vec3.vert | 26 ++ .../shaders/glsl-features/floor-vec4-ref.frag | 30 ++ .../shaders/glsl-features/floor-vec4-ref.vert | 37 ++ .../shaders/glsl-features/floor-vec4.frag | 17 + .../shaders/glsl-features/floor-vec4.vert | 25 ++ .../shaders/glsl-features/floor.frag | 18 + .../shaders/glsl-features/floor.vert | 28 ++ .../shaders/glsl-features/fract-ref.frag | 23 + .../shaders/glsl-features/fract-ref.vert | 32 ++ .../shaders/glsl-features/fract-vec2-ref.frag | 29 ++ .../shaders/glsl-features/fract-vec2-ref.vert | 37 ++ .../shaders/glsl-features/fract-vec2.frag | 18 + .../shaders/glsl-features/fract-vec2.vert | 27 ++ .../shaders/glsl-features/fract-vec3-ref.frag | 30 ++ .../shaders/glsl-features/fract-vec3-ref.vert | 37 ++ .../shaders/glsl-features/fract-vec3.frag | 18 + .../shaders/glsl-features/fract-vec3.vert | 26 ++ .../shaders/glsl-features/fract-vec4-ref.frag | 30 ++ .../shaders/glsl-features/fract-vec4-ref.vert | 36 ++ .../shaders/glsl-features/fract-vec4.frag | 16 + .../shaders/glsl-features/fract-vec4.vert | 24 ++ .../shaders/glsl-features/fract.frag | 18 + .../shaders/glsl-features/fract.vert | 28 ++ .../shaders/glsl-features/sign-ref.frag | 26 ++ .../shaders/glsl-features/sign-ref.vert | 29 ++ .../shaders/glsl-features/sign-vec2-ref.frag | 31 ++ .../shaders/glsl-features/sign-vec2-ref.vert | 32 ++ .../shaders/glsl-features/sign-vec2.frag | 18 + .../shaders/glsl-features/sign-vec2.vert | 23 + .../shaders/glsl-features/sign-vec3-ref.frag | 32 ++ .../shaders/glsl-features/sign-vec3-ref.vert | 31 ++ .../shaders/glsl-features/sign-vec3.frag | 18 + .../shaders/glsl-features/sign-vec3.vert | 22 + .../shaders/glsl-features/sign-vec4-ref.frag | 32 ++ .../shaders/glsl-features/sign-vec4-ref.vert | 35 ++ .../shaders/glsl-features/sign-vec4.frag | 17 + .../shaders/glsl-features/sign-vec4.vert | 22 + .../shaders/glsl-features/sign.frag | 19 + .../shaders/glsl-features/sign.vert | 24 ++ .../conformance/shaders/misc/00_shaders.txt | 2 + .../conformance/shaders/misc/shared-a.frag | 34 ++ .../conformance/shaders/misc/shared-b.frag | 31 ++ .../conformance/shaders/misc/shared.vert | 41 ++ ...d-sub-image-2d-with-array-buffer-view.html | 5 +- ...ex-image-and-sub-image-2d-with-canvas.html | 115 +++++ ...mage-and-sub-image-2d-with-image-data.html | 5 +- ...tex-image-and-sub-image-2d-with-image.html | 43 +- ...tex-image-and-sub-image-2d-with-video.html | 8 +- .../tex-image-and-uniform-binding-bugs.html | 4 +- .../tex-image-with-format-and-type.html | 4 +- .../tex-image-with-invalid-data.html | 8 +- .../conformance/tex-input-validation.html | 4 +- .../tex-sub-image-2d-bad-args.html | 2 + .../webgl/conformance/tex-sub-image-2d.html | 9 +- .../webgl/conformance/texparameter-test.html | 16 +- .../conformance/texture-active-bind-2.html | 16 +- .../conformance/texture-active-bind.html | 6 +- .../webgl/conformance/texture-complete.html | 6 +- .../conformance/texture-formats-test.html | 10 +- .../webgl/conformance/texture-npot-video.html | 156 +++++++ .../test/webgl/conformance/texture-npot.html | 12 +- ...exture-transparent-pixels-initialized.html | 4 +- .../test/webgl/conformance/triangle.html | 4 +- .../conformance/type-conversion-test.html | 4 +- .../webgl/conformance/uniform-location.html | 4 +- .../conformance/uniform-samplers-test.html | 11 +- .../webgl/conformance/uninitialized-test.html | 4 +- .../viewport-unchanged-upon-resize.html | 3 +- .../webgl/conformance/webgl-specific.html | 10 +- .../test/webgl/extra/big-fbos-example.html | 2 +- .../webgl/extra/canvas-compositing-test.html | 1 + .../test/webgl/extra/fbo-lost-context.html | 2 +- .../webgl/extra/lots-of-polys-example.html | 4 + .../test/webgl/extra/out-of-memory.html | 2 +- .../test/webgl/extra/out-of-resources.html | 2 +- .../test/webgl/extra/slow-shader-example.html | 13 +- .../canvas/test/webgl/extra/webgl-info.html | 1 + .../canvas/test/webgl/failing_tests_linux.txt | 16 +- .../canvas/test/webgl/failing_tests_mac.txt | 15 +- .../test/webgl/failing_tests_windows.txt | 12 +- .../test/webgl/misc/program-test-1.html | 3 +- .../test/webgl/resources/opengl_logo.jpg | Bin 5827 -> 0 bytes .../resources/thunderbird-logo-64x64.png | Bin 63843 -> 0 bytes .../test/webgl/webgl-conformance-tests.html | 15 +- 287 files changed, 5070 insertions(+), 1163 deletions(-) create mode 100644 content/canvas/test/webgl/conformance/buffer-offscreen-test.html create mode 100644 content/canvas/test/webgl/conformance/canvas-zero-size.html create mode 100644 content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html create mode 100644 content/canvas/test/webgl/conformance/drawingbuffer-test.html create mode 100755 content/canvas/test/webgl/conformance/gl-fragcoord.html create mode 100644 content/canvas/test/webgl/conformance/gl-geterror.html delete mode 100644 content/canvas/test/webgl/conformance/gl-min-textures-unroll.html create mode 100755 content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html create mode 100755 content/canvas/test/webgl/conformance/glsl-features.html create mode 100644 content/canvas/test/webgl/conformance/glsl-long-variable-names.html create mode 100644 content/canvas/test/webgl/conformance/premultiplyalpha-test.html create mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.mp4 create mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.theora.ogv create mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm create mode 100755 content/canvas/test/webgl/conformance/shaders/00_test_list.txt create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert create mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag create mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared.vert create mode 100644 content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html create mode 100644 content/canvas/test/webgl/conformance/texture-npot-video.html delete mode 100644 content/canvas/test/webgl/resources/opengl_logo.jpg delete mode 100644 content/canvas/test/webgl/resources/thunderbird-logo-64x64.png diff --git a/content/canvas/test/webgl/00_test_list.txt b/content/canvas/test/webgl/00_test_list.txt index a04e846d4134..ef8cb3dbbc60 100644 --- a/content/canvas/test/webgl/00_test_list.txt +++ b/content/canvas/test/webgl/00_test_list.txt @@ -2,4 +2,5 @@ // other lines are assumed to be .html files conformance/00_test_list.txt +conformance/more/00_test_list.txt diff --git a/content/canvas/test/webgl/README.mozilla b/content/canvas/test/webgl/README.mozilla index de4caffcdc8d..0efeebab5e31 100644 --- a/content/canvas/test/webgl/README.mozilla +++ b/content/canvas/test/webgl/README.mozilla @@ -1,13 +1,15 @@ -This is a local copy of the WebGL conformance suite, version 1.0.0. +This is a local copy of the WebGL conformance suite, SVN revision 15318 The canonical location for this testsuite is: - https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/conformance-suites/1.0.0/webgl-conformance-tests.html + https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/webgl-conformance-tests.html All files and directories in this directory, with the exceptions listed below, come from upstream and should not be modified without corresponding upstream fixes and/or a patch file in this directory. The exceptions (the Mozilla-specific files) are: + * the crossorigin directory is not from upstream (not easy to share, as it relies on special features of the HTTP server used for our test framework) * README.mozilla (this file) * failing_tests_*.txt * Makefile.in * *.patch files, if any + diff --git a/content/canvas/test/webgl/conformance/00_test_list.txt b/content/canvas/test/webgl/conformance/00_test_list.txt index 86d0dba26042..423fbfe9647c 100644 --- a/content/canvas/test/webgl/conformance/00_test_list.txt +++ b/content/canvas/test/webgl/conformance/00_test_list.txt @@ -5,7 +5,9 @@ bad-arguments-test.html buffer-bind-test.html buffer-data-array-buffer.html buffer-preserve-test.html +buffer-offscreen-test.html canvas-test.html +canvas-zero-size.html constants.html context-attributes-alpha-depth-stencil-antialias.html context-lost-restored.html @@ -14,6 +16,8 @@ context-type-test.html copy-tex-image-and-sub-image-2d.html draw-arrays-out-of-bounds.html draw-elements-out-of-bounds.html +drawingbuffer-static-canvas-test.html +drawingbuffer-test.html error-reporting.html framebuffer-object-attachment.html framebuffer-test.html @@ -24,13 +28,16 @@ gl-drawelements.html gl-enable-enum-test.html gl-enable-vertex-attrib.html gl-enum-tests.html +gl-fragcoord.html +shaders/00_test_list.txt gl-get-active-attribute.html gl-get-active-uniform.html gl-get-calls.html +gl-geterror.html gl-getshadersource.html gl-getstring.html gl-min-attribs.html -# gl-min-textures.html +gl-min-textures.html gl-min-uniforms.html gl-object-get-calls.html gl-pixelstorei.html @@ -41,11 +48,13 @@ gl-uniform-arrays.html gl-uniform-bool.html gl-uniformmatrix4fv.html gl-unknown-uniform.html -gl-vertex-attrib.html gl-vertex-attrib-zero-issues.html +gl-vertex-attrib.html gl-vertexattribpointer.html +gl-vertexattribpointer-offsets.html #glsl-2types-of-textures-on-same-unit.html glsl-conformance.html +glsl-long-variable-names.html incorrect-context-object-behaviour.html index-validation-copies-indices.html index-validation-crash-with-buffer-sub-data.html @@ -64,14 +73,16 @@ object-deletion-behaviour.html oes-standard-derivatives.html oes-texture-float.html oes-vertex-array-object.html -# origin-clean-conformance.html # is obsolete because of bug 656277 +origin-clean-conformance.html point-size.html +premultiplyalpha-test.html program-test.html read-pixels-pack-alignment.html read-pixels-test.html renderbuffer-initialization.html resource-sharing-test.html tex-image-and-sub-image-2d-with-array-buffer-view.html +tex-image-and-sub-image-2d-with-canvas.html tex-image-and-sub-image-2d-with-image-data.html tex-image-and-sub-image-2d-with-image.html tex-image-and-sub-image-2d-with-video.html @@ -87,6 +98,7 @@ texture-active-bind.html texture-complete.html texture-formats-test.html texture-npot.html +texture-npot-video.html texture-transparent-pixels-initialized.html triangle.html type-conversion-test.html @@ -95,5 +107,3 @@ uniform-samplers-test.html uninitialized-test.html viewport-unchanged-upon-resize.html webgl-specific.html -more/00_test_list.txt - diff --git a/content/canvas/test/webgl/conformance/array-buffer-crash.html b/content/canvas/test/webgl/conformance/array-buffer-crash.html index 0a571a17e5b7..4ee8fb4eeb3c 100644 --- a/content/canvas/test/webgl/conformance/array-buffer-crash.html +++ b/content/canvas/test/webgl/conformance/array-buffer-crash.html @@ -1,10 +1,11 @@ + @@ -33,9 +34,5 @@ successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/array-buffer-view-crash.html b/content/canvas/test/webgl/conformance/array-buffer-view-crash.html index 4a98d189fcdd..6a468a1f9ef3 100644 --- a/content/canvas/test/webgl/conformance/array-buffer-view-crash.html +++ b/content/canvas/test/webgl/conformance/array-buffer-view-crash.html @@ -1,5 +1,5 @@ + + @@ -59,8 +61,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/array-unit-tests.html b/content/canvas/test/webgl/conformance/array-unit-tests.html index e90a8d4c87d8..26cf44102a6a 100644 --- a/content/canvas/test/webgl/conformance/array-unit-tests.html +++ b/content/canvas/test/webgl/conformance/array-unit-tests.html @@ -1,6 +1,6 @@ + + @@ -510,7 +512,11 @@ function testConstructionWithOutOfRangeValues(type, name) { shouldThrowIndexSizeErr(function() { var buffer = new ArrayBuffer(4); var array = new type(buffer, 4, 0x3FFFFFFF); - }, "Construction of " + name + " with out-of-range values"); + }, "Construction of " + name + " with out-of-range number of elements"); + shouldThrowIndexSizeErr(function() { + var buffer = new ArrayBuffer(4); + var array = new type(buffer, 8); + }, "Construction of " + name + " with out-of-range offset"); } function testConstructionWithNegativeOutOfRangeValues(type, name) { @@ -575,6 +581,21 @@ function testConstructionWithBothArrayBufferAndLength(type, name, elementSizeInB } } +function testConstructionWithSubPortionOfArrayBuffer(type, name, elementSizeInBytes) { + if (elementSizeInBytes > 1) { + // Test construction with a valid sub-portion of an array buffer + // (whose size is not an integral multiple of the element size). + var size = 4 * elementSizeInBytes + (elementSizeInBytes / 2); + var buf = new ArrayBuffer(size); + try { + var array = new type(buf, 0, 2); + testPassed("new " + name + "(new ArrayBuffer(" + size + "), 0, 2) succeeded"); + } catch (e) { + testFailed("new " + name + "(new ArrayBuffer(" + size + "), 0, 2) failed: " + e); + } + } +} + // These need to be global for shouldBe to see them var array; var typeSize; @@ -704,6 +725,12 @@ function testNaNConversion(type, name) { results[i] = array[i]; } break; + case Float64Array: + for (var i = 0; i < array.length; ++i) { + array[i] = NaN; + results[i] = array[i]; + } + break; case Int8Array: for (var i = 0; i < array.length; ++i) { array[i] = NaN; @@ -746,7 +773,7 @@ function testNaNConversion(type, name) { } // Some types preserve NaN values; all other types convert NaN to zero. - if (type === Float32Array) { + if (type === Float32Array || type === Float64Array) { assert('initial NaN preserved', isNaN(new type([NaN])[0])); for (var i = 0; i < array.length; ++i) assert('NaN preserved via setter', isNaN(results[i])); @@ -779,6 +806,13 @@ function runTests() { testValues: [ -500.5, 500.5 ], expectedValues: [ -500.5, 500.5 ] }, + {name: "Float64Array", + unsigned: false, + integral: false, + elementSizeInBytes: 8, + testValues: [ -500.5, 500.5 ], + expectedValues: [ -500.5, 500.5 ] + }, {name: "Int8Array", unsigned: false, integral: true, @@ -866,6 +900,7 @@ function runTests() { testConstructionWithUnalignedLength(type, name, testCase.elementSizeInBytes); testConstructionOfHugeArray(type, name, testCase.elementSizeInBytes); testConstructionWithBothArrayBufferAndLength(type, name, testCase.elementSizeInBytes); + testConstructionWithSubPortionOfArrayBuffer(type, name, testCase.elementSizeInBytes); testSubarrayWithOutOfRangeValues(type, name, testCase.elementSizeInBytes); testSubarrayWithDefaultValues(type, name, testCase.elementSizeInBytes); testSettingFromArrayWithOutOfRangeOffset(type, name); diff --git a/content/canvas/test/webgl/conformance/bad-arguments-test.html b/content/canvas/test/webgl/conformance/bad-arguments-test.html index 3b38115952fc..df0c5037d057 100644 --- a/content/canvas/test/webgl/conformance/bad-arguments-test.html +++ b/content/canvas/test/webgl/conformance/bad-arguments-test.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/buffer-bind-test.html b/content/canvas/test/webgl/conformance/buffer-bind-test.html index 4f6fd7e443b5..fd231cd777c2 100644 --- a/content/canvas/test/webgl/conformance/buffer-bind-test.html +++ b/content/canvas/test/webgl/conformance/buffer-bind-test.html @@ -1,12 +1,12 @@ - + + WebGL BindBuffer conformance test. @@ -56,12 +56,8 @@ if (!gl) { debug(""); successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html b/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html index f4ac10b1c7bc..94314770c141 100644 --- a/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html +++ b/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/buffer-offscreen-test.html b/content/canvas/test/webgl/conformance/buffer-offscreen-test.html new file mode 100644 index 000000000000..e47475987902 --- /dev/null +++ b/content/canvas/test/webgl/conformance/buffer-offscreen-test.html @@ -0,0 +1,92 @@ + + + + +WebGL required buffer clear behaviour test + + + + + + + + +
+ +
+ + + diff --git a/content/canvas/test/webgl/conformance/buffer-preserve-test.html b/content/canvas/test/webgl/conformance/buffer-preserve-test.html index 338ae589169e..eb7cc2bbb59d 100644 --- a/content/canvas/test/webgl/conformance/buffer-preserve-test.html +++ b/content/canvas/test/webgl/conformance/buffer-preserve-test.html @@ -1,6 +1,7 @@ + WebGL required buffer clear behaviour test @@ -14,37 +15,30 @@ body { @@ -188,8 +187,6 @@ if (!gl) { }, 1000/30); } - diff --git a/content/canvas/test/webgl/conformance/canvas-zero-size.html b/content/canvas/test/webgl/conformance/canvas-zero-size.html new file mode 100644 index 000000000000..200ee93a231c --- /dev/null +++ b/content/canvas/test/webgl/conformance/canvas-zero-size.html @@ -0,0 +1,42 @@ + + + + + + Zero Size Canvas Test + + + + + + +
+
+ + + + + diff --git a/content/canvas/test/webgl/conformance/constants.html b/content/canvas/test/webgl/conformance/constants.html index 33a0222e352e..8e850919cd2e 100644 --- a/content/canvas/test/webgl/conformance/constants.html +++ b/content/canvas/test/webgl/conformance/constants.html @@ -1,11 +1,12 @@ + + - WebGL Constants Test @@ -481,8 +482,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html b/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html index 67e7a00d3f22..5dc4ecd39b30 100644 --- a/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html +++ b/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html @@ -1,10 +1,12 @@ + + @@ -21,9 +23,8 @@ void main() - - - - - - - -
diff --git a/content/canvas/test/webgl/conformance/context-lost-restored.html b/content/canvas/test/webgl/conformance/context-lost-restored.html index 56443a477998..ec54cd0d7ad5 100644 --- a/content/canvas/test/webgl/conformance/context-lost-restored.html +++ b/content/canvas/test/webgl/conformance/context-lost-restored.html @@ -1,5 +1,7 @@ + + @@ -15,6 +17,7 @@ var bufferObjects; var program; var texture; var texColor = [255, 10, 20, 255]; +var allowRestore; function init() { @@ -22,24 +25,66 @@ function init() window.initNonKhronosFramework(true); } - description("Tests behavior under a restored context"); + description("Tests behavior under a restored context."); - canvas = document.getElementById("canvas"); - canvas.addEventListener("webglcontextlost", testLostContext, false); - canvas.addEventListener("webglcontextrestored", testRestoredContext, false); - - gl = wtu.create3DContext(canvas); shouldGenerateGLError = wtu.shouldGenerateGLError; + runTests(); +} +function runTests() +{ + testLosingContext(); + testLosingAndRestoringContext(); + + finish(); +} + +function setupTest() +{ + canvas = document.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + gl = wtu.create3DContext(canvas); extension = gl.getExtension(extension_name); if (!extension) { debug(extension_name + " extension not found."); - finish(); - return; + return false; } + return true; +} + +function testLosingContext() +{ + if (!setupTest()) + return; + + debug("Test losing a context and inability to restore it."); + + canvas.addEventListener("webglcontextlost", testLostContext); + canvas.addEventListener("webglcontextrestored", testShouldNotRestoreContext); + allowRestore = false; testOriginalContext(); extension.loseContext(); + shouldGenerateGLError(gl, gl.INVALID_OPERATION, "extension.restoreContext()"); + debug(""); +} + +function testLosingAndRestoringContext() +{ + if (!setupTest()) + return; + + debug("Test losing and restoring a context."); + + canvas.addEventListener("webglcontextlost", testLostContext); + canvas.addEventListener("webglcontextrestored", testRestoredContext); + allowRestore = true; + + testOriginalContext(); + extension.loseContext(); + shouldGenerateGLError(gl, gl.NO_ERROR, "extension.restoreContext()"); + debug(""); } function testRendering() @@ -70,13 +115,21 @@ function testOriginalContext() debug(""); } -function testLostContext() +function testLostContext(e) { debug("Test lost context"); shouldBeTrue("gl.isContextLost()"); shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL"); shouldBe("gl.getError()", "gl.NO_ERROR"); debug(""); + if (allowRestore) + e.preventDefault(); +} + +function testShouldNotRestoreContext(e) +{ + testFailed("Should not restore the context unless preventDefault is called on the context lost event"); + debug(""); } function testResources(expected) @@ -105,8 +158,6 @@ function testRestoredContext() // Validate new resources created in testRendering(). testResources(gl.NO_ERROR); debug(""); - - finish(); } function finish() { @@ -125,6 +176,5 @@ function finish() {
- diff --git a/content/canvas/test/webgl/conformance/context-lost.html b/content/canvas/test/webgl/conformance/context-lost.html index 07305bbc7a59..4269535669b0 100644 --- a/content/canvas/test/webgl/conformance/context-lost.html +++ b/content/canvas/test/webgl/conformance/context-lost.html @@ -1,5 +1,7 @@ + + @@ -62,6 +64,9 @@ function loseContext() { debug(""); debug("Lose context"); + + // Note: this will cause the context to be lost, and the + // webglcontextlost event listener to be called, immediately. shouldGenerateGLError(gl, gl.NO_ERROR, "extension.loseContext()"); debug(""); } @@ -135,8 +140,8 @@ function testLostContext() "gl.blendColor(1.0, 1.0, 1.0, 1.0)", "gl.blendEquation(gl.FUNC_ADD)", "gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD)", - "gl.blendFunc(gl.ONE)", - "gl.blendFuncSeparate(gl.ONE, gl.ONE)", + "gl.blendFunc(gl.ONE, gl.ONE)", + "gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE)", "gl.bufferData(gl.ARRAY_BUFFER, 0, gl.STATIC_DRAW)", "gl.bufferData(gl.ARRAY_BUFFER, arrayBufferView, gl.STATIC_DRAW)", "gl.bufferData(gl.ARRAY_BUFFER, arrayBuffer, gl.STATIC_DRAW)", @@ -295,6 +300,8 @@ function testLostContext() shouldBe("gl.getError()", "gl.NO_ERROR"); + debug(""); + finish(); } diff --git a/content/canvas/test/webgl/conformance/context-type-test.html b/content/canvas/test/webgl/conformance/context-type-test.html index 0b4f116c67f0..f763a3d0db2e 100644 --- a/content/canvas/test/webgl/conformance/context-type-test.html +++ b/content/canvas/test/webgl/conformance/context-type-test.html @@ -1,13 +1,12 @@ - + - + WebGL Canvas Conformance Tests @@ -25,6 +24,11 @@ description("This test ensures WebGL implementations interact correctly with the debug(""); debug("Canvas.getContext"); +assertMsg(window.WebGLRenderingContext, + "WebGLRenderingContext should be a member of window"); +assertMsg('WebGLRenderingContext' in window, + "WebGLRenderingContext should be 'in' window"); + var canvas = document.getElementById("canvas"); var gl = create3DContext(canvas); if (!gl) { @@ -40,8 +44,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html b/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html index cc48ce91fa86..838d2c67d70f 100644 --- a/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html +++ b/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html b/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html index 5474d79ab6e0..0f0543feeb6c 100644 --- a/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html +++ b/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html b/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html index 7104d085a96a..fad679f1b79d 100644 --- a/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html +++ b/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html b/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html new file mode 100644 index 000000000000..5760959fdcb6 --- /dev/null +++ b/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html @@ -0,0 +1,61 @@ + + + + + +WebGL Canvas Conformance Tests + + + + + + +
+
+ + + + + diff --git a/content/canvas/test/webgl/conformance/drawingbuffer-test.html b/content/canvas/test/webgl/conformance/drawingbuffer-test.html new file mode 100644 index 000000000000..95b1b0176c83 --- /dev/null +++ b/content/canvas/test/webgl/conformance/drawingbuffer-test.html @@ -0,0 +1,60 @@ + + + + + +WebGL Canvas Conformance Tests + + + + + + +
+
+ + + + diff --git a/content/canvas/test/webgl/conformance/error-reporting.html b/content/canvas/test/webgl/conformance/error-reporting.html index cb54b27d24da..d3a74925d6f4 100644 --- a/content/canvas/test/webgl/conformance/error-reporting.html +++ b/content/canvas/test/webgl/conformance/error-reporting.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html b/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html index e5caa22f4777..e22cff8db037 100644 --- a/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html +++ b/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html @@ -1,10 +1,12 @@ + + @@ -21,8 +23,8 @@ var depthBuffer; var stencilBuffer; var depthStencilBuffer; var colorBuffer; -var width = 2; -var height = 2; +var width; +var height; function testAttachment(attachment, buffer, isConflicted) { @@ -31,7 +33,13 @@ function testAttachment(attachment, buffer, isConflicted) gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, buffer); glErrorShouldBe(gl, gl.NO_ERROR); - if (isConflicted) { + // If the framebuffer is in an error state for multiple reasons, + // we can't guarantee which one will be reported. + if ((width == 0 || height == 0) && !isConflicted) { + // Zero-sized renderbuffers are supposed to result in an incomplete attachment. + // However, certain combination may violate implementation specific restrictions. + shouldBeTrue("gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT || gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_UNSUPPORTED"); + } else if (isConflicted) { shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED"); gl.clear(gl.COLOR_BUFFER_BIT); glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION); @@ -49,8 +57,15 @@ function testAttachments(attachment0, buffer0, attachment1, buffer1, isConflicte glErrorShouldBe(gl, gl.NO_ERROR); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment1, gl.RENDERBUFFER, buffer1); glErrorShouldBe(gl, gl.NO_ERROR); - if (isConflicted) + // If the framebuffer is in an error state for multiple reasons, + // we can't guarantee which one will be reported. + if ((width == 0 || height == 0) && !isConflicted) { + // Zero-sized renderbuffers are supposed to result in an incomplete attachment. + // However, certain combination may violate implementation specific restrictions. + shouldBeTrue("gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT || gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_UNSUPPORTED"); + } else if (isConflicted) { shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED"); + } } function testColorRenderbuffer(internalformat) @@ -68,83 +83,100 @@ function testDepthStencilRenderbuffer() gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); glErrorShouldBe(gl, gl.NO_ERROR); - shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width"); - shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height"); + + // OpenGL itself doesn't seem to guarantee that e.g. a 2 x 0 + // renderbuffer will report 2 for its width when queried. + if (!(height == 0 && width > 0)) + shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width"); + if (!(width == 0 && height > 0)) + shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)", "gl.DEPTH_STENCIL"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE)", "0"); - shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0"); - shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0"); + // Avoid verifying these for zero-sized renderbuffers for the time + // being since it appears that even OpenGL doesn't guarantee them. + if (width > 0 && height > 0) { + shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0"); + shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0"); + } glErrorShouldBe(gl, gl.NO_ERROR); testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); } description("Test framebuffer object attachment behaviors"); -debug("Create renderbuffers"); -shouldBeNonNull("gl = create3DContext()"); -shouldBeNonNull("colorBuffer = gl.createRenderbuffer()"); -gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer); -gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height); -glErrorShouldBe(gl, gl.NO_ERROR); -shouldBeNonNull("depthBuffer = gl.createRenderbuffer()"); -gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); -gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); -glErrorShouldBe(gl, gl.NO_ERROR); -shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()"); -gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer); -gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height); -glErrorShouldBe(gl, gl.NO_ERROR); -shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()"); -gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); -gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); -glErrorShouldBe(gl, gl.NO_ERROR); +for (width = 0; width <= 2; width += 2) +{ + for (height = 0; height <= 2; height += 2) + { + debug("Dimensions " + width + " x " + height); -debug("Attach depth using DEPTH_ATTACHMENT"); -testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false); -debug("Attach depth using STENCIL_ATTACHMENT"); -testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, true); -debug("Attach depth using DEPTH_STENCIL_ATTACHMENT"); -testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, true); -debug("Attach stencil using STENCIL_ATTACHMENT"); -testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, false); -debug("Attach stencil using DEPTH_ATTACHMENT"); -testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, true); -debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT"); -testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, true); -debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT"); -testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); -debug("Attach depthStencil using DEPTH_ATTACHMENT"); -testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, true); -debug("Attach depthStencil using STENCIL_ATTACHMENT"); -testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, true); + debug("Create renderbuffers"); + shouldBeNonNull("gl = create3DContext()"); + shouldBeNonNull("colorBuffer = gl.createRenderbuffer()"); + gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height); + glErrorShouldBe(gl, gl.NO_ERROR); + shouldBeNonNull("depthBuffer = gl.createRenderbuffer()"); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); + glErrorShouldBe(gl, gl.NO_ERROR); + shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()"); + gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height); + glErrorShouldBe(gl, gl.NO_ERROR); + shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()"); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); + glErrorShouldBe(gl, gl.NO_ERROR); -debug("Attach depth, then stencil, causing conflict"); -testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); -debug("Attach stencil, then depth, causing conflict"); -testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); -debug("Attach depth, then depthStencil, causing conflict"); -testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); -debug("Attach depthStencil, then depth, causing conflict"); -testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); -debug("Attach stencil, then depthStencil, causing conflict"); -testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); -debug("Attach depthStencil, then stencil, causing conflict"); -testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); + debug("Attach depth using DEPTH_ATTACHMENT"); + testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false); + debug("Attach depth using STENCIL_ATTACHMENT"); + testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, true); + debug("Attach depth using DEPTH_STENCIL_ATTACHMENT"); + testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, true); + debug("Attach stencil using STENCIL_ATTACHMENT"); + testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, false); + debug("Attach stencil using DEPTH_ATTACHMENT"); + testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, true); + debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT"); + testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, true); + debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT"); + testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); + debug("Attach depthStencil using DEPTH_ATTACHMENT"); + testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, true); + debug("Attach depthStencil using STENCIL_ATTACHMENT"); + testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, true); -debug("Attach color renderbuffer with internalformat == RGBA4"); -testColorRenderbuffer(gl.RGBA4); + debug("Attach depth, then stencil, causing conflict"); + testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); + debug("Attach stencil, then depth, causing conflict"); + testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); + debug("Attach depth, then depthStencil, causing conflict"); + testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); + debug("Attach depthStencil, then depth, causing conflict"); + testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); + debug("Attach stencil, then depthStencil, causing conflict"); + testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); + debug("Attach depthStencil, then stencil, causing conflict"); + testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); -debug("Attach color renderbuffer with internalformat == RGB5_A1"); -testColorRenderbuffer(gl.RGB5_A1); + debug("Attach color renderbuffer with internalformat == RGBA4"); + testColorRenderbuffer(gl.RGBA4); -debug("Attach color renderbuffer with internalformat == RGB565"); -testColorRenderbuffer(gl.RGB565); + debug("Attach color renderbuffer with internalformat == RGB5_A1"); + testColorRenderbuffer(gl.RGB5_A1); -debug("Create and attach depthStencil renderbuffer"); -testDepthStencilRenderbuffer(); + debug("Attach color renderbuffer with internalformat == RGB565"); + testColorRenderbuffer(gl.RGB565); + + debug("Create and attach depthStencil renderbuffer"); + testDepthStencilRenderbuffer(); + } +} successfullyParsed = true; diff --git a/content/canvas/test/webgl/conformance/framebuffer-test.html b/content/canvas/test/webgl/conformance/framebuffer-test.html index bdc7f1f9bcba..fbd0e6e9bb52 100644 --- a/content/canvas/test/webgl/conformance/framebuffer-test.html +++ b/content/canvas/test/webgl/conformance/framebuffer-test.html @@ -1,13 +1,12 @@ - + - + WebGL Framebuffer Test @@ -168,8 +167,6 @@ successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/get-active-test.html b/content/canvas/test/webgl/conformance/get-active-test.html index 02e0092a8451..bd270c643207 100644 --- a/content/canvas/test/webgl/conformance/get-active-test.html +++ b/content/canvas/test/webgl/conformance/get-active-test.html @@ -1,5 +1,5 @@ - + + diff --git a/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html b/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html index c947fea9b761..39ef578fb62c 100644 --- a/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html +++ b/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html @@ -1,13 +1,12 @@ - + - + WebGL BindAttribLocation Conformance Tests @@ -28,9 +27,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/gl-drawelements.html b/content/canvas/test/webgl/conformance/gl-drawelements.html index 91e07a372490..1ec4d8d55c40 100644 --- a/content/canvas/test/webgl/conformance/gl-drawelements.html +++ b/content/canvas/test/webgl/conformance/gl-drawelements.html @@ -1,12 +1,12 @@ - + + WebGL drawElements Test @@ -90,11 +90,7 @@ found in the LICENSE file. init(); successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/gl-enable-enum-test.html b/content/canvas/test/webgl/conformance/gl-enable-enum-test.html index ecdb07f4baf8..4808a66fec16 100644 --- a/content/canvas/test/webgl/conformance/gl-enable-enum-test.html +++ b/content/canvas/test/webgl/conformance/gl-enable-enum-test.html @@ -1,13 +1,12 @@ - + - + WebGL gl.ENABLE enums Conformance Tests @@ -130,8 +129,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html b/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html index 68450181b45a..35dbbb1b8997 100644 --- a/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html +++ b/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html @@ -1,11 +1,12 @@ + WebGL Enable Vertex Attrib Test @@ -49,12 +50,8 @@ glErrorShouldBe(gl, gl.INVALID_OPERATION); successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/gl-enum-tests.html b/content/canvas/test/webgl/conformance/gl-enum-tests.html index 7647883ef9f9..09ec73a5df8c 100644 --- a/content/canvas/test/webgl/conformance/gl-enum-tests.html +++ b/content/canvas/test/webgl/conformance/gl-enum-tests.html @@ -1,13 +1,12 @@ - + - + WebGL gl enums Conformance Tests @@ -83,9 +82,6 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-fragcoord.html b/content/canvas/test/webgl/conformance/gl-fragcoord.html new file mode 100755 index 000000000000..599b2e0cddc4 --- /dev/null +++ b/content/canvas/test/webgl/conformance/gl-fragcoord.html @@ -0,0 +1,84 @@ + + + + + + gl-fragcoord Test + + + + + + + + +
+
+ + + + + + + + + diff --git a/content/canvas/test/webgl/conformance/gl-get-active-attribute.html b/content/canvas/test/webgl/conformance/gl-get-active-attribute.html index 1f0aae8a4c20..cc0d18da2d46 100644 --- a/content/canvas/test/webgl/conformance/gl-get-active-attribute.html +++ b/content/canvas/test/webgl/conformance/gl-get-active-attribute.html @@ -1,12 +1,12 @@ - + + WebGL getActiveAttrib conformance test. @@ -77,12 +77,8 @@ for (var tt = 0; tt < tests.length; ++tt) { successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/gl-get-active-uniform.html b/content/canvas/test/webgl/conformance/gl-get-active-uniform.html index 03672867b3e3..acd33746caa2 100644 --- a/content/canvas/test/webgl/conformance/gl-get-active-uniform.html +++ b/content/canvas/test/webgl/conformance/gl-get-active-uniform.html @@ -1,12 +1,12 @@ - + + WebGL getActiveUniform conformance test. @@ -138,12 +138,8 @@ glErrorShouldBe(gl, gl.INVALID_OPERATION, successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/gl-get-calls.html b/content/canvas/test/webgl/conformance/gl-get-calls.html index 894f6a1fd33e..4d490807a7ea 100644 --- a/content/canvas/test/webgl/conformance/gl-get-calls.html +++ b/content/canvas/test/webgl/conformance/gl-get-calls.html @@ -1,5 +1,5 @@ - + + - + WebGL gl calls Conformance Tests @@ -147,8 +148,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-geterror.html b/content/canvas/test/webgl/conformance/gl-geterror.html new file mode 100644 index 000000000000..bba5e7ba67ac --- /dev/null +++ b/content/canvas/test/webgl/conformance/gl-geterror.html @@ -0,0 +1,77 @@ + + + + +WebGL get error conformance test. + + + + + + + + +
+ + + + + diff --git a/content/canvas/test/webgl/conformance/gl-getshadersource.html b/content/canvas/test/webgl/conformance/gl-getshadersource.html index 073a5f4eabcb..6d137eeb1d49 100644 --- a/content/canvas/test/webgl/conformance/gl-getshadersource.html +++ b/content/canvas/test/webgl/conformance/gl-getshadersource.html @@ -1,13 +1,12 @@  - + - + WebGL getShaderSource conformance test. @@ -32,13 +31,8 @@ shouldBe("source", "original"); glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors."); successfullyParsed = true; - - - - diff --git a/content/canvas/test/webgl/conformance/gl-getstring.html b/content/canvas/test/webgl/conformance/gl-getstring.html index 1b71de7236e6..f4eb2b221c7a 100644 --- a/content/canvas/test/webgl/conformance/gl-getstring.html +++ b/content/canvas/test/webgl/conformance/gl-getstring.html @@ -1,13 +1,12 @@ - + - + WebGL gl.getParameter Strings Conformance Tests @@ -55,8 +54,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-min-attribs.html b/content/canvas/test/webgl/conformance/gl-min-attribs.html index 2dd128de85fa..193bd468ec92 100644 --- a/content/canvas/test/webgl/conformance/gl-min-attribs.html +++ b/content/canvas/test/webgl/conformance/gl-min-attribs.html @@ -1,12 +1,12 @@ - + + WebGL the minimum number of attributes are supported. @@ -35,9 +35,7 @@ void main() - - diff --git a/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html b/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html deleted file mode 100644 index 2783087ccde5..000000000000 --- a/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - -WebGL the minimum number of uniforms are supported. - - - - - - - -
-
- - - - - - - - - - - - - diff --git a/content/canvas/test/webgl/conformance/gl-min-textures.html b/content/canvas/test/webgl/conformance/gl-min-textures.html index ab18e3427ae4..29f6da68d598 100644 --- a/content/canvas/test/webgl/conformance/gl-min-textures.html +++ b/content/canvas/test/webgl/conformance/gl-min-textures.html @@ -1,12 +1,12 @@ - + + WebGL the minimum number of uniforms are supported. @@ -27,9 +27,7 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/gl-min-uniforms.html b/content/canvas/test/webgl/conformance/gl-min-uniforms.html index e3a1e8ad3e9c..3db640e27c8f 100644 --- a/content/canvas/test/webgl/conformance/gl-min-uniforms.html +++ b/content/canvas/test/webgl/conformance/gl-min-uniforms.html @@ -1,12 +1,12 @@ - + + WebGL the minimum number of uniforms are supported. @@ -34,9 +34,7 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/gl-object-get-calls.html b/content/canvas/test/webgl/conformance/gl-object-get-calls.html index c2c966e45baf..0224b24563ad 100644 --- a/content/canvas/test/webgl/conformance/gl-object-get-calls.html +++ b/content/canvas/test/webgl/conformance/gl-object-get-calls.html @@ -1,5 +1,5 @@ + + @@ -259,9 +261,9 @@ glErrorShouldBe(gl, gl.NO_ERROR); // Test cases where name == 0 gl.deleteTexture(texture); -shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)'); +shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); gl.deleteRenderbuffer(renderbuffer); -shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)'); +shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); gl.deleteBuffer(buffer); shouldBeNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)'); glErrorShouldBe(gl, gl.NO_ERROR); diff --git a/content/canvas/test/webgl/conformance/gl-pixelstorei.html b/content/canvas/test/webgl/conformance/gl-pixelstorei.html index 151fe75acfe2..34fda692ffd9 100644 --- a/content/canvas/test/webgl/conformance/gl-pixelstorei.html +++ b/content/canvas/test/webgl/conformance/gl-pixelstorei.html @@ -1,12 +1,12 @@ - + + WebGL pixelStorei Test @@ -119,11 +119,7 @@ function init() { init(); successfullyParsed = true; - - - diff --git a/content/canvas/test/webgl/conformance/gl-scissor-test.html b/content/canvas/test/webgl/conformance/gl-scissor-test.html index bbab2dd17ac9..b4cc0f8855a7 100644 --- a/content/canvas/test/webgl/conformance/gl-scissor-test.html +++ b/content/canvas/test/webgl/conformance/gl-scissor-test.html @@ -1,13 +1,12 @@ - + - + WebGL Scissor Test @@ -70,8 +69,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-shader-test.html b/content/canvas/test/webgl/conformance/gl-shader-test.html index 0138fcb71501..cba94d737861 100644 --- a/content/canvas/test/webgl/conformance/gl-shader-test.html +++ b/content/canvas/test/webgl/conformance/gl-shader-test.html @@ -1,13 +1,12 @@ - + - + WebGL ShaderL Conformance Tests @@ -45,8 +44,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-teximage.html b/content/canvas/test/webgl/conformance/gl-teximage.html index b101a9addd3b..8fd9cfdd217a 100644 --- a/content/canvas/test/webgl/conformance/gl-teximage.html +++ b/content/canvas/test/webgl/conformance/gl-teximage.html @@ -1,12 +1,12 @@ - + + WebGL texImage2D conformance test. diff --git a/content/canvas/test/webgl/conformance/gl-uniform-arrays.html b/content/canvas/test/webgl/conformance/gl-uniform-arrays.html index 3f939551ab6b..72714115a29e 100644 --- a/content/canvas/test/webgl/conformance/gl-uniform-arrays.html +++ b/content/canvas/test/webgl/conformance/gl-uniform-arrays.html @@ -1,13 +1,12 @@ - + - + WebGL uniform array Conformance Tests @@ -26,9 +25,7 @@ found in the LICENSE file. - - diff --git a/content/canvas/test/webgl/conformance/gl-uniform-bool.html b/content/canvas/test/webgl/conformance/gl-uniform-bool.html index f757f48b7595..dd6e352332a8 100644 --- a/content/canvas/test/webgl/conformance/gl-uniform-bool.html +++ b/content/canvas/test/webgl/conformance/gl-uniform-bool.html @@ -1,13 +1,12 @@ - + - + WebGL uniformMatrix Conformance Tests @@ -53,8 +52,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html b/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html index 614bc62af466..82ef2d66b7b2 100644 --- a/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html +++ b/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html @@ -1,13 +1,12 @@ - + - + WebGL uniformMatrix Conformance Tests diff --git a/content/canvas/test/webgl/conformance/gl-unknown-uniform.html b/content/canvas/test/webgl/conformance/gl-unknown-uniform.html index 197a2952c4de..d29543d1fe91 100644 --- a/content/canvas/test/webgl/conformance/gl-unknown-uniform.html +++ b/content/canvas/test/webgl/conformance/gl-unknown-uniform.html @@ -1,13 +1,12 @@ - + - + WebGL Unknown Uniform Conformance Test @@ -62,8 +61,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html b/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html index fda08ac428c4..499ee6edbbc6 100644 --- a/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html +++ b/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html @@ -1,11 +1,12 @@ + WebGL Enable Vertex Attrib Zero Test @@ -89,9 +90,6 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/gl-vertex-attrib.html b/content/canvas/test/webgl/conformance/gl-vertex-attrib.html index ecea7e2df2cf..6934231e52bf 100644 --- a/content/canvas/test/webgl/conformance/gl-vertex-attrib.html +++ b/content/canvas/test/webgl/conformance/gl-vertex-attrib.html @@ -1,13 +1,12 @@ - + - + WebGL vertexAttrib Conformance Tests diff --git a/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html b/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html new file mode 100755 index 000000000000..e522438b6248 --- /dev/null +++ b/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html @@ -0,0 +1,192 @@ + + + + + + + Rendering Test + + + + + + + +There is supposed to be an example drawing here, but it's not important. + +
+
+ + + + + + + + + diff --git a/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html b/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html index 87991b18c538..ac600f18fff7 100644 --- a/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html +++ b/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html @@ -1,13 +1,12 @@ - + - + WebGL vertexAttribPointer Conformance Tests @@ -130,8 +129,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html b/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html index 4fb11b92bc86..0c1e85d65df2 100644 --- a/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html +++ b/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html @@ -1,12 +1,12 @@ - + + WebGL GLSL 2 types of textures on same unit conformance test. @@ -30,9 +30,8 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/glsl-conformance.html b/content/canvas/test/webgl/conformance/glsl-conformance.html index 97fd0f2256e2..598ae8a2ff08 100644 --- a/content/canvas/test/webgl/conformance/glsl-conformance.html +++ b/content/canvas/test/webgl/conformance/glsl-conformance.html @@ -1,13 +1,12 @@ - + - + WebGL GLSL Conformance Tests @@ -34,7 +33,8 @@ void main() @@ -307,6 +307,143 @@ void main() gl_FragColor = vec4(0,0,0,0); } + + + + + + + + + - - diff --git a/content/canvas/test/webgl/conformance/glsl-features.html b/content/canvas/test/webgl/conformance/glsl-features.html new file mode 100755 index 000000000000..8775985b85ac --- /dev/null +++ b/content/canvas/test/webgl/conformance/glsl-features.html @@ -0,0 +1,234 @@ + + + + + + GLSL feature Test + + + + + + + + + + + + + + +
reftestdiff
+
+
+ + + + + + diff --git a/content/canvas/test/webgl/conformance/glsl-long-variable-names.html b/content/canvas/test/webgl/conformance/glsl-long-variable-names.html new file mode 100644 index 000000000000..bbcf729fba08 --- /dev/null +++ b/content/canvas/test/webgl/conformance/glsl-long-variable-names.html @@ -0,0 +1,130 @@ + + + + + glsl long variable name mapping tests + + + + + + + There is supposed to be an example drawing here, but it's not important. + +
Verify that shader long variable names works fine if they are within 256 characters.
+
+ + + + + + + + diff --git a/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html b/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html index 588401dd8fdb..c24b12590581 100644 --- a/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html +++ b/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/index-validation-copies-indices.html b/content/canvas/test/webgl/conformance/index-validation-copies-indices.html index 1158628871c5..54f1547867e5 100644 --- a/content/canvas/test/webgl/conformance/index-validation-copies-indices.html +++ b/content/canvas/test/webgl/conformance/index-validation-copies-indices.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html b/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html index fb44226bd067..80ecfa1e456a 100644 --- a/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html +++ b/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html b/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html index e023c7a4e659..d5c2a6cd1769 100644 --- a/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html +++ b/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html b/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html index 260d4c6fbb80..5fdceb97329b 100644 --- a/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html +++ b/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html @@ -1,10 +1,12 @@ + + @@ -24,9 +26,7 @@ void main() { } diff --git a/content/canvas/test/webgl/conformance/instanceof-test.html b/content/canvas/test/webgl/conformance/instanceof-test.html index 3e5aee4cce16..1e40003081ba 100644 --- a/content/canvas/test/webgl/conformance/instanceof-test.html +++ b/content/canvas/test/webgl/conformance/instanceof-test.html @@ -1,12 +1,12 @@ - + + WebGL instanceof test. @@ -27,9 +27,7 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/invalid-UTF-16.html b/content/canvas/test/webgl/conformance/invalid-UTF-16.html index 00709aca2b60..9b562d1f9d8c 100644 --- a/content/canvas/test/webgl/conformance/invalid-UTF-16.html +++ b/content/canvas/test/webgl/conformance/invalid-UTF-16.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/invalid-passed-params.html b/content/canvas/test/webgl/conformance/invalid-passed-params.html index c88a2dec8e05..cdf5411d5034 100644 --- a/content/canvas/test/webgl/conformance/invalid-passed-params.html +++ b/content/canvas/test/webgl/conformance/invalid-passed-params.html @@ -1,5 +1,5 @@ + + @@ -125,7 +127,7 @@ context.shaderSource(vShader, generateShaderSource()); context.compileShader(vShader); shouldBe("context.getError()", "context.NO_ERROR"); var fShader = context.createShader(context.FRAGMENT_SHADER); -context.shaderSource(fShader, "precision highp float;\n" +context.shaderSource(fShader, "precision mediump float;\n" + "varying float " + validAttribName + ";\n" + "void main() {\n" + "gl_FragColor = vec4(" + validAttribName + ", 0.0, 0.0, 1.0); }"); diff --git a/content/canvas/test/webgl/conformance/is-object.html b/content/canvas/test/webgl/conformance/is-object.html index 390f9b97d024..6231727062cc 100644 --- a/content/canvas/test/webgl/conformance/is-object.html +++ b/content/canvas/test/webgl/conformance/is-object.html @@ -1,5 +1,7 @@ + + diff --git a/content/canvas/test/webgl/conformance/methods.html b/content/canvas/test/webgl/conformance/methods.html index 8b6fab6348f9..258815e3f9fc 100644 --- a/content/canvas/test/webgl/conformance/methods.html +++ b/content/canvas/test/webgl/conformance/methods.html @@ -1,11 +1,12 @@ + + - WebGL Methods Test @@ -194,8 +195,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/more-than-65536-points.html b/content/canvas/test/webgl/conformance/more-than-65536-points.html index 52017357ea38..35eb53fb6168 100644 --- a/content/canvas/test/webgl/conformance/more-than-65536-points.html +++ b/content/canvas/test/webgl/conformance/more-than-65536-points.html @@ -1,12 +1,12 @@ - + + WebGL More than 65536 points. @@ -27,9 +27,7 @@ void main() { } diff --git a/content/canvas/test/webgl/conformance/more/conformance/constants.html b/content/canvas/test/webgl/conformance/more/conformance/constants.html index df3ae870524c..5ab8389186e5 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/constants.html +++ b/content/canvas/test/webgl/conformance/more/conformance/constants.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html b/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html index 81b54fb8e9a2..959a17181d2b 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html +++ b/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/getContext.html b/content/canvas/test/webgl/conformance/more/conformance/getContext.html index 094cd7311e82..ab32e9c56356 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/getContext.html +++ b/content/canvas/test/webgl/conformance/more/conformance/getContext.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/methods.html b/content/canvas/test/webgl/conformance/more/conformance/methods.html index 2b904df1106a..085453ae71fe 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/methods.html +++ b/content/canvas/test/webgl/conformance/more/conformance/methods.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html index f5f2a4aa633d..98adf35ac3e8 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html +++ b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html index 7eae3bdb221a..f86aadab4e2b 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html b/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html index 2b9479c84b67..0e41c57cffcf 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html +++ b/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html @@ -1,6 +1,6 @@ - + - + @@ -145,9 +145,8 @@ Tests.testThatWritesChangeDrawing = function(gl) { } @@ -249,9 +249,8 @@ window.addEventListener("load", init, false); diff --git a/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html index b2feff22d282..80bb7d74ae12 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html b/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html index d65bc7361084..a7fafa80dc40 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html +++ b/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html @@ -1,7 +1,7 @@ - + + OpenGL for the web - diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferData.html b/content/canvas/test/webgl/conformance/more/functions/bufferData.html index 3024b542d345..7946f19e241b 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferData.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferData.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html index e624f57581de..53fab67adf96 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html b/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html index 8fb0ceb461f3..ccfa7ed38575 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html index 245b0c3fc3bf..2c191e1a4dd4 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html b/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html index 4d191f216df9..2138b625dcda 100644 --- a/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html @@ -1,9 +1,10 @@ - + + - @@ -113,9 +113,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html b/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html index f696306d1ef4..97f78bc33290 100644 --- a/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html @@ -1,9 +1,10 @@ - + + - @@ -125,9 +125,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html index c04fd6579dae..1569bfb7158e 100644 --- a/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/drawArrays.html b/content/canvas/test/webgl/conformance/more/functions/drawArrays.html index 20b154fce3f7..f23895dce0f3 100644 --- a/content/canvas/test/webgl/conformance/more/functions/drawArrays.html +++ b/content/canvas/test/webgl/conformance/more/functions/drawArrays.html @@ -1,9 +1,10 @@ - + + - @@ -118,9 +118,8 @@ Tests.testDrawArraysVBOMulti = function(gl, prog, v,n,t) { } @@ -289,9 +289,8 @@ Tests.testDrawArraysOOBShaderJuggle = function(gl, prog, v,n,t) { } @@ -126,9 +126,8 @@ Tests.testDrawElementsVBOMulti = function(gl, prog, v,n,t) { } @@ -192,9 +192,8 @@ Tests.testSharedBuffers = function(gl, prog, v,n,t) { } diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixels.html b/content/canvas/test/webgl/conformance/more/functions/readPixels.html index 4bbf3ef058dc..1740d8a846d3 100644 --- a/content/canvas/test/webgl/conformance/more/functions/readPixels.html +++ b/content/canvas/test/webgl/conformance/more/functions/readPixels.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html index d443878693ca..451c929a1264 100644 --- a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html @@ -1,9 +1,10 @@ - + + - @@ -75,17 +75,16 @@ Tests.testReadPixels = function(gl) { new Uint8Array(1*4));}); } -/* this part is obsolete because of bug 656277 - * Tests.testReadPixelsSOPIMG = function(gl) { var img = document.getElementById("i"); while (!img.complete) {} var tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); - gl.bindTexture(gl.TEXTURE_2D, null); // SOP failure assertThrowNoGLError(gl, "throw because img is from another domain", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); + gl.bindTexture(gl.TEXTURE_2D, null); + assertOk("canvas still origin-clean", function(){gl.readPixels(0,0,1,1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));}); gl.deleteTexture(tex); @@ -99,15 +98,15 @@ Tests.testReadPixelsSOPCanvas = function(gl) { function(){c.getContext("2d").getImageData(0,0,1,1);}); var tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); - gl.bindTexture(gl.TEXTURE_2D, null); // SOP failure assertThrowNoGLError(gl, "throw because canvas is not origin clean", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); + gl.bindTexture(gl.TEXTURE_2D, null); + assertOk("canvas still origin-clean", function(){gl.readPixels(0,0,1,1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));}); gl.deleteTexture(tex); } -*/ Tests.endUnit = function(gl) { } @@ -116,5 +115,5 @@ Tests.endUnit = function(gl) { - + diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2D.html b/content/canvas/test/webgl/conformance/more/functions/texImage2D.html index f9827c425cd4..58bcf239612b 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2D.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html index fd639ffa4f91..faf85a6af2de 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html index ebd889ff28d1..aeb68d51983b 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html @@ -1,9 +1,10 @@ - + + - @@ -99,8 +99,10 @@ Tests.testTexImage2DNonSOP = function(gl) { var c = document.getElementById('c'); var ctx = c.getContext('2d'); ctx.drawImage(img,0,0); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); + assertThrowNoGLError(gl, "texImage2D with cross-origin image should throw exception.", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); + assertThrowNoGLError(gl, "texImage2D with dirty origin canvas should throw exception.", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); } Tests.endUnit = function(gl) { @@ -130,9 +132,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html index dfd48fdc1fd1..25025faf110b 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html index ecd8d0a4c504..c88c788c57c1 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html @@ -1,9 +1,10 @@ - + + - diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html index 6bac9430846b..9621fd1c7ef8 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html @@ -1,9 +1,10 @@ - + + - @@ -107,10 +107,14 @@ Tests.testTexImage2DNonSOP = function(gl) { var c = document.getElementById('c'); var ctx = c.getContext('2d'); ctx.drawImage(img,0,0); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, img); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, c); + assertThrowNoGLError(gl, "texImage2D with cross-origin image should throw exception.", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); + assertThrowNoGLError(gl, "texSubImage2D with cross-origin image should throw exception.", + function(){gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, img);}); + assertThrowNoGLError(gl, "texImage2D with dirty origin canvas should throw exception.", + function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); + assertThrowNoGLError(gl, "texSubImage2D with dirty origin canvas should throw exception.", + function(){gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, c);}); } Tests.endUnit = function(gl) { @@ -140,9 +144,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html b/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html index b723b0a77800..447abb5bc51a 100644 --- a/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html +++ b/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html @@ -1,6 +1,6 @@ - + - + @@ -47,9 +47,7 @@ void main() } @@ -121,9 +121,7 @@ void main() } @@ -52,9 +52,8 @@ void main() } @@ -74,9 +74,8 @@ void main() } @@ -79,9 +79,8 @@ void main() } @@ -52,9 +52,8 @@ void main() } @@ -75,9 +75,7 @@ void main() } @@ -125,9 +125,8 @@ Tests.testVertexAttribVBO = function(gl, prog, v,n,t) { } @@ -101,9 +101,8 @@ Tests.testVertexAttrib = function(gl, prog, v,n,t) { } @@ -89,9 +89,8 @@ Tests.testVertexAttribPointerVBO = function(gl, prog, v,n,t) { } @@ -114,9 +114,8 @@ Tests.testVertexAttribPointerVBO = function(gl, prog, v,n,t) { } @@ -169,9 +169,8 @@ arr.forEach(function(e){ @@ -87,9 +87,7 @@ Tests.testMandelbrot = function(gl) { } @@ -131,9 +131,8 @@ arr.forEach(function(e){ @@ -74,9 +74,8 @@ Tests.testPassingTooManyUniforms = function(gl) { @@ -297,9 +297,8 @@ Tests.gpuGaussianBlur = function(gl) { @@ -168,9 +168,8 @@ Tests.endUnit = function(gl) { diff --git a/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html b/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html index 203a9fbc1e25..ddb8d77b4dcf 100644 --- a/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html +++ b/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html b/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html index dbae1b85a8aa..9bacc9806999 100644 --- a/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html +++ b/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/unit.js b/content/canvas/test/webgl/conformance/more/unit.js index 1396523d3cba..57cdb620fd7a 100644 --- a/content/canvas/test/webgl/conformance/more/unit.js +++ b/content/canvas/test/webgl/conformance/more/unit.js @@ -1,7 +1,7 @@ /* Unit testing library for the OpenGL ES 2.0 HTML Canvas context -Copyright (C) 2009 Ilmari Heikkinen +Copyright (C) 2011 Ilmari Heikkinen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/content/canvas/test/webgl/conformance/more/util.js b/content/canvas/test/webgl/conformance/more/util.js index 8d89a5d0467b..b7ed8904fa73 100644 --- a/content/canvas/test/webgl/conformance/more/util.js +++ b/content/canvas/test/webgl/conformance/more/util.js @@ -1,7 +1,7 @@ /* Utilities for the OpenGL ES 2.0 HTML Canvas context -Copyright (C) 2009 Ilmari Heikkinen +Copyright (C) 2011 Ilmari Heikkinen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/content/canvas/test/webgl/conformance/null-object-behaviour.html b/content/canvas/test/webgl/conformance/null-object-behaviour.html index 1aa25d98841e..564d2367bd18 100644 --- a/content/canvas/test/webgl/conformance/null-object-behaviour.html +++ b/content/canvas/test/webgl/conformance/null-object-behaviour.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/null-uniform-location.html b/content/canvas/test/webgl/conformance/null-uniform-location.html index 7c75f9fae3fa..92ab95c856b5 100644 --- a/content/canvas/test/webgl/conformance/null-uniform-location.html +++ b/content/canvas/test/webgl/conformance/null-uniform-location.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/object-deletion-behaviour.html b/content/canvas/test/webgl/conformance/object-deletion-behaviour.html index 952bbae14d9c..5f8848ead4db 100644 --- a/content/canvas/test/webgl/conformance/object-deletion-behaviour.html +++ b/content/canvas/test/webgl/conformance/object-deletion-behaviour.html @@ -1,10 +1,12 @@ + + @@ -64,7 +66,8 @@ shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHME shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)"); // Deleting a texture bound to the currently-bound fbo is the same as // detaching the textue from fbo first, then delete the texture. -shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); +shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); shouldBeFalse("gl.isTexture(tex)"); shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); @@ -90,7 +93,8 @@ shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHME shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); // Deleting a renderbuffer bound to the currently-bound fbo is the same as // detaching the renderbuffer from fbo first, then delete the renderbuffer. -shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); +shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); +shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); shouldBeFalse("gl.isRenderbuffer(rbo)"); shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)"); shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); diff --git a/content/canvas/test/webgl/conformance/oes-standard-derivatives.html b/content/canvas/test/webgl/conformance/oes-standard-derivatives.html index 552f74b24a43..9f6b75a44cbf 100644 --- a/content/canvas/test/webgl/conformance/oes-standard-derivatives.html +++ b/content/canvas/test/webgl/conformance/oes-standard-derivatives.html @@ -3,11 +3,10 @@ Copyright (c) 2011 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - + - + WebGL OES_standard_derivatives Conformance Tests @@ -70,7 +69,7 @@ void main() { - diff --git a/content/canvas/test/webgl/conformance/oes-texture-float.html b/content/canvas/test/webgl/conformance/oes-texture-float.html index 9ba3949a24d9..18da6183b85d 100644 --- a/content/canvas/test/webgl/conformance/oes-texture-float.html +++ b/content/canvas/test/webgl/conformance/oes-texture-float.html @@ -1,13 +1,12 @@ - + - + WebGL OES_texture_float Conformance Tests @@ -84,11 +83,9 @@ if (!gl) { testPassed("No OES_texture_float support -- this is legal"); } else { testPassed("Successfully enabled OES_texture_float extension"); - dump('XXXXXX ' + gl.getExtension("OES_texture_float") + '\n'); runTextureCreationTest(testProgram, true); runRenderTargetTest(testProgram); - // this sub-test is currently failing, see discussion in bug 630672 - // runUniqueObjectTest(); + runUniqueObjectTest(); } } @@ -210,6 +207,8 @@ function runUniqueObjectTest() gl.getExtension("OES_texture_float").myProperty = 2; if (window.GCController) { window.GCController.collect(); + } else if (window.opera && window.opera.collect) { + window.opera.collect(); } else { attemptToForceGC(); } @@ -221,8 +220,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/oes-vertex-array-object.html b/content/canvas/test/webgl/conformance/oes-vertex-array-object.html index e5313f8971a7..7912dc922b64 100644 --- a/content/canvas/test/webgl/conformance/oes-vertex-array-object.html +++ b/content/canvas/test/webgl/conformance/oes-vertex-array-object.html @@ -3,11 +3,10 @@ Copyright (c) 2011 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - + - + WebGL OES_vertex_array_object Conformance Tests @@ -393,8 +392,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/origin-clean-conformance.html b/content/canvas/test/webgl/conformance/origin-clean-conformance.html index ada1a30b4b47..981032e89600 100644 --- a/content/canvas/test/webgl/conformance/origin-clean-conformance.html +++ b/content/canvas/test/webgl/conformance/origin-clean-conformance.html @@ -1,13 +1,12 @@ - + - + WebGL Origin Restrictions Conformance Tests @@ -33,22 +32,32 @@ function causedException(func) { try { func(); } catch(e) { - //debug(e); hadException = true; } - //debug ("hadException: " + hadException); return hadException; } window.onload = function() { - description("This test ensures WebGL implementations follow proper origin restrictions."); - debug(""); + description("This test ensures WebGL implementations follow proper same-origin restrictions."); var img = document.getElementById("img"); + assertMsg(img.width > 0 && img.height > 0, "img was loaded"); imgDomain = getBaseDomain(img.src); pageDomain = getBaseDomain(window.location.toString()); assertMsg(imgDomain != pageDomain, "img domain (" + imgDomain + ") and page domain (" + pageDomain + ") are not the same."); + function makeTexImage2D(gl, src) { + return function() { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src); + }; + } + + function makeTexSubImage2D(gl, src) { + return function() { + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, src); + }; + } + function makeReadPixels(gl) { return function() { var buf = new Uint8Array(4); @@ -62,56 +71,44 @@ window.onload = function() { } } - debug(""); - debug("check that copying an img from another origin clears the origin-clean flag."); var canvas1 = document.getElementById("canvas1"); - var gl1 = create3DContext(canvas1); - assertMsg(!causedException(makeReadPixels(gl1)), - "should not throw exception by readPixels for origin clean canvas."); - assertMsg(!causedException(makeToDataURL(canvas1)), - "should not throw exception by toDataURL for origin clean canvas."); - - var tex = gl1.createTexture(); - gl1.bindTexture(gl1.TEXTURE_2D, tex); - gl1.texImage2D(gl1.TEXTURE_2D, 0, gl1.RGBA, gl1.RGBA, gl1.UNSIGNED_BYTE, img); - - assertMsg(causedException(makeReadPixels(gl1)), - "should throw exception by readPixels for NON origin clean canvas."); - assertMsg(causedException(makeToDataURL(canvas1)), - "should throw exception by toDataURL for NON origin clean canvas."); + var gl = create3DContext(canvas1); debug(""); - debug("check that copying from 1 unclean 3d canvas to another clears the origin-clean flag on the second canvas."); + debug("check that an attempt to upload an image from another origin throws an exception."); + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + assertMsg(causedException(makeTexImage2D(gl, img)), + "texImage2D with cross-origin image should throw exception."); + assertMsg(causedException(makeTexSubImage2D(gl, img)), + "texSubImage2D with cross-origin image should throw exception."); + + debug("check that readPixels and toDataURL continue to work against this canvas."); + assertMsg(!causedException(makeReadPixels(gl)), + "readPixels should never throw exception -- not possible to dirty origin of WebGL canvas."); + assertMsg(!causedException(makeToDataURL(canvas1)), + "should not throw exception by toDataURL for WebGL canvas, which should stay origin clean."); + + debug("check that an attempt to upload a tainted canvas throws an exception."); var canvas2 = document.getElementById("canvas2"); - var gl2 = create3DContext(canvas2); - - assertMsg(!causedException(makeReadPixels(gl2)), - "should not throw exception by readPixels for origin clean canvas."); - assertMsg(!causedException(makeToDataURL(canvas2)), - "should not throw exception by toDataURL for origin clean canvas."); - - var tex = gl2.createTexture(); - gl2.bindTexture(gl2.TEXTURE_2D, tex); - gl2.texImage2D( - gl2.TEXTURE_2D, 0, gl2.RGBA, gl2.RGBA, gl2.UNSIGNED_BYTE, canvas1); - - assertMsg(causedException(makeReadPixels(gl2)), - "should throw exception by readPixels for NON origin clean canvas."); + var ctx2d = canvas2.getContext("2d"); + ctx2d.drawImage(img, 0, 0); assertMsg(causedException(makeToDataURL(canvas2)), "should throw exception by toDataURL for NON origin clean canvas."); + assertMsg(causedException(makeTexImage2D(gl, canvas2)), + "texImage2D with NON origin clean canvas should throw exception."); + assertMsg(causedException(makeTexSubImage2D(gl, canvas2)), + "texSubImage2D with NON origin clean canvas should throw exception."); - debug(""); - debug("check that copying from 1 unclean 3d canvas to a 2d canvas clears the origin-clean flag on the 2d canvas."); - var canvas3 = document.getElementById("canvas3"); - var ctx2d = canvas3.getContext("2d"); - assertMsg(!causedException(makeToDataURL(canvas3)), - "should not throw exception by toDataURL for origin clean canvas."); - ctx2d.drawImage(canvas2, 0, 0); - assertMsg(causedException(makeToDataURL(canvas3)), - "should throw exception by toDataURL for NON origin clean canvas."); + debug("check that readPixels and toDataURL continue to work against this canvas."); + assertMsg(!causedException(makeReadPixels(gl)), + "readPixels should never throw exception -- not possible to dirty origin of WebGL canvas."); + assertMsg(!causedException(makeToDataURL(canvas1)), + "should not throw exception by toDataURL for WebGL canvas, which should stay origin clean."); - - // TODO: Should check video? + // TODO: Should check video. + // TODO: Should check CORS support. debug(""); successfullyParsed = true; @@ -126,7 +123,6 @@ window.onload = function() {
- - + diff --git a/content/canvas/test/webgl/conformance/point-size.html b/content/canvas/test/webgl/conformance/point-size.html index efc20639a02d..28af503b71aa 100644 --- a/content/canvas/test/webgl/conformance/point-size.html +++ b/content/canvas/test/webgl/conformance/point-size.html @@ -1,10 +1,12 @@ + + @@ -23,9 +25,7 @@ void main() + + + + +
+ + + + + + diff --git a/content/canvas/test/webgl/conformance/program-test.html b/content/canvas/test/webgl/conformance/program-test.html index eb7603b8109a..665d2b9ac4d9 100644 --- a/content/canvas/test/webgl/conformance/program-test.html +++ b/content/canvas/test/webgl/conformance/program-test.html @@ -1,13 +1,12 @@ - + - + WebGL Program Compiling/Linking Conformance Test @@ -86,14 +85,14 @@ function go() { "bad vertex shader should fail to compile"); var fs = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs); assertMsg(gl.getShaderParameter(fs, gl.COMPILE_STATUS) == true, "good fragment shader should compile"); var fs2 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs2, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }"); + gl.shaderSource(fs2, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }"); gl.compileShader(fs2); assertMsg(gl.getShaderParameter(fs2, gl.COMPILE_STATUS) == true, @@ -273,7 +272,7 @@ function go() { glErrorShouldBe(gl, gl.NO_ERROR, "The current program shouldn't be deleted"); var fs3 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs3); assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true, @@ -284,7 +283,7 @@ function go() { glErrorShouldBe(gl, gl.INVALID_VALUE, "an unattached shader should be deleted immediately"); fs3 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs3); assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true, diff --git a/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html b/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html index 2035894492ed..bda059b2eb1a 100644 --- a/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html +++ b/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html @@ -1,10 +1,12 @@ + + @@ -21,9 +23,7 @@ void main() @@ -39,6 +39,7 @@ gl.clear(gl.COLOR_BUFFER_BIT); // Resize the canvas to 2x2. This is an attempt to get stuff in the backbuffer. // that shouldn't be there. +canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false); canvas.addEventListener("webglcontextrestored", continueTestAfterContextRestored, false); canvas.width = width; canvas.height = height; diff --git a/content/canvas/test/webgl/conformance/renderbuffer-initialization.html b/content/canvas/test/webgl/conformance/renderbuffer-initialization.html index 40a8922cdb45..ceae1ec6a988 100644 --- a/content/canvas/test/webgl/conformance/renderbuffer-initialization.html +++ b/content/canvas/test/webgl/conformance/renderbuffer-initialization.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/resource-sharing-test.html b/content/canvas/test/webgl/conformance/resource-sharing-test.html index f6e455c017b5..a5ff9d883a12 100644 --- a/content/canvas/test/webgl/conformance/resource-sharing-test.html +++ b/content/canvas/test/webgl/conformance/resource-sharing-test.html @@ -1,12 +1,12 @@ - + + WebGL Resource Sharing. @@ -35,12 +35,7 @@ assertMsg( successfullyParsed = true; - - - - diff --git a/content/canvas/test/webgl/conformance/resources/fragmentShader.frag b/content/canvas/test/webgl/conformance/resources/fragmentShader.frag index 250d0cf1c917..08596ed5db12 100644 --- a/content/canvas/test/webgl/conformance/resources/fragmentShader.frag +++ b/content/canvas/test/webgl/conformance/resources/fragmentShader.frag @@ -24,11 +24,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Workaround for non-compliant WebGL implementations (FIXME) -#if defined(GL_ES) varying mediump vec3 v_normal; -#else -varying vec3 v_normal; -#endif void main() { diff --git a/content/canvas/test/webgl/conformance/resources/npot-video.mp4 b/content/canvas/test/webgl/conformance/resources/npot-video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..59f5f774a783b459385451b4c5df238001cb9f1d GIT binary patch literal 38215 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 Ly0TFJ+T*_f5*U8o literal 0 HcmV?d00001 diff --git a/content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm b/content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm new file mode 100644 index 0000000000000000000000000000000000000000..47277bdaac1f47f803bbe696913a53fa28548f59 GIT binary patch literal 51240 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 color The color to fill clear with before drawing. A * 4 element array where each element is in the range 0 to 255. * @param {string} msg Message to associate with success. Eg ("should be red"). + * @param {number} errorRange Optional. Acceptable error in + * color checking. 0 by default. */ -var checkCanvas = function(gl, color, msg) { - checkCanvasRect(gl, 0, 0, gl.canvas.width, gl.canvas.height, color, msg); +var checkCanvas = function(gl, color, msg, errorRange) { + checkCanvasRect(gl, 0, 0, gl.canvas.width, gl.canvas.height, color, msg, errorRange); }; /** @@ -620,8 +620,19 @@ var readFileList = function(url) { str[0] != '#' && str[0] != ";" && str.substr(0, 2) != "//") { - new_url = prefix + str; - files = files.concat(readFileList(new_url)); + var names = str.split(/ +/); + if (names.length == 1) { + new_url = prefix + str; + files = files.concat(readFileList(new_url)); + } else { + var s = ""; + var p = ""; + for (var jj = 0; jj < names.length; ++jj) { + s += p + prefix + names[jj]; + p = " "; + } + files.push(s); + } } } } else { @@ -835,6 +846,29 @@ var loadImagesAsync = function(urls, callback) { countDown(); }; +var getUrlArguments = function() { + var args = {}; + try { + var s = window.location.href; + var q = s.indexOf("?"); + var e = s.indexOf("#"); + if (e < 0) { + e = s.length; + } + var query = s.substring(q + 1, e); + var pairs = query.split("&"); + for (var ii = 0; ii < pairs.length; ++ii) { + var keyValue = pairs[ii].split("="); + var key = keyValue[0]; + var value = decodeURIComponent(keyValue[1]); + args[key] = value; + } + } catch (e) { + throw "could not parse url"; + } + return args; +}; + return { create3DContext: create3DContext, create3DContextWithWrapperThatThrowsOnGLError: @@ -845,6 +879,7 @@ return { drawQuad: drawQuad, endsWith: endsWith, getLastError: getLastError, + getUrlArguments: getUrlArguments, glEnumToString: glEnumToString, glErrorShouldBe: glErrorShouldBe, fillTexture: fillTexture, diff --git a/content/canvas/test/webgl/conformance/resources/webgl-test.js b/content/canvas/test/webgl/conformance/resources/webgl-test.js index 451cb68885ec..4e6b16df60d9 100644 --- a/content/canvas/test/webgl/conformance/resources/webgl-test.js +++ b/content/canvas/test/webgl/conformance/resources/webgl-test.js @@ -1,5 +1,5 @@ /* -Copyright (C) 2009 Apple Computer, Inc. All rights reserved. +Copyright (C) 2011 Apple Computer, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -702,7 +702,7 @@ function doLoadImageTexture(ctx, image, texture) { ctx.enable(ctx.TEXTURE_2D); ctx.bindTexture(ctx.TEXTURE_2D, texture); - ctx.texImage2D(ctx.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); + ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR_MIPMAP_LINEAR); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE); diff --git a/content/canvas/test/webgl/conformance/shaders/00_test_list.txt b/content/canvas/test/webgl/conformance/shaders/00_test_list.txt new file mode 100755 index 000000000000..4394d1d95fe4 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/00_test_list.txt @@ -0,0 +1,2 @@ +glsl-features/00_test_list.txt + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt b/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt new file mode 100755 index 000000000000..28eea83966a3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt @@ -0,0 +1,48 @@ +../../glsl-features.html?feature=base + +../../glsl-features.html?feature=abs-frag&reffs=shaders/glsl-features/abs-ref.frag&testfs=shaders/glsl-features/abs.frag +../../glsl-features.html?feature=abs-frag-vec2&reffs=shaders/glsl-features/abs-vec2-ref.frag&testfs=shaders/glsl-features/abs-vec2.frag +../../glsl-features.html?feature=abs-frag-vec3&reffs=shaders/glsl-features/abs-vec3-ref.frag&testfs=shaders/glsl-features/abs-vec3.frag +../../glsl-features.html?feature=abs-frag-vec4&reffs=shaders/glsl-features/abs-vec4-ref.frag&testfs=shaders/glsl-features/abs-vec4.frag +../../glsl-features.html?feature=abs-vert&refvs=shaders/glsl-features/abs-ref.vert&testvs=shaders/glsl-features/abs.vert +../../glsl-features.html?feature=abs-vert-vec2&refvs=shaders/glsl-features/abs-vec2-ref.vert&testvs=shaders/glsl-features/abs-vec2.vert +../../glsl-features.html?feature=abs-vert-vec3&refvs=shaders/glsl-features/abs-vec3-ref.vert&testvs=shaders/glsl-features/abs-vec3.vert +../../glsl-features.html?feature=abs-vert-vec4&refvs=shaders/glsl-features/abs-vec4-ref.vert&testvs=shaders/glsl-features/abs-vec4.vert + +../../glsl-features.html?feature=sign-frag&reffs=shaders/glsl-features/sign-ref.frag&testfs=shaders/glsl-features/sign.frag +../../glsl-features.html?feature=sign-frag-vec2&reffs=shaders/glsl-features/sign-vec2-ref.frag&testfs=shaders/glsl-features/sign-vec2.frag +../../glsl-features.html?feature=sign-frag-vec3&reffs=shaders/glsl-features/sign-vec3-ref.frag&testfs=shaders/glsl-features/sign-vec3.frag +../../glsl-features.html?feature=sign-frag-vec4&reffs=shaders/glsl-features/sign-vec4-ref.frag&testfs=shaders/glsl-features/sign-vec4.frag +../../glsl-features.html?feature=sign-vert&refvs=shaders/glsl-features/sign-ref.vert&testvs=shaders/glsl-features/sign.vert +../../glsl-features.html?feature=sign-vert-vec2&refvs=shaders/glsl-features/sign-vec2-ref.vert&testvs=shaders/glsl-features/sign-vec2.vert +../../glsl-features.html?feature=sign-vert-vec3&refvs=shaders/glsl-features/sign-vec3-ref.vert&testvs=shaders/glsl-features/sign-vec3.vert +../../glsl-features.html?feature=sign-vert-vec4&refvs=shaders/glsl-features/sign-vec4-ref.vert&testvs=shaders/glsl-features/sign-vec4.vert + +../../glsl-features.html?feature=floor-frag&reffs=shaders/glsl-features/floor-ref.frag&testfs=shaders/glsl-features/floor.frag +../../glsl-features.html?feature=floor-frag-vec2&reffs=shaders/glsl-features/floor-vec2-ref.frag&testfs=shaders/glsl-features/floor-vec2.frag +../../glsl-features.html?feature=floor-frag-vec3&reffs=shaders/glsl-features/floor-vec3-ref.frag&testfs=shaders/glsl-features/floor-vec3.frag +../../glsl-features.html?feature=floor-frag-vec4&reffs=shaders/glsl-features/floor-vec4-ref.frag&testfs=shaders/glsl-features/floor-vec4.frag +../../glsl-features.html?res=8&feature=floor-vert&refvs=shaders/glsl-features/floor-ref.vert&testvs=shaders/glsl-features/floor.vert +../../glsl-features.html?res=8&feature=floor-vert-vec2&refvs=shaders/glsl-features/floor-vec2-ref.vert&testvs=shaders/glsl-features/floor-vec2.vert +../../glsl-features.html?res=8&feature=floor-vert-vec3&refvs=shaders/glsl-features/floor-vec3-ref.vert&testvs=shaders/glsl-features/floor-vec3.vert +../../glsl-features.html?res=8&feature=floor-vert-vec4&refvs=shaders/glsl-features/floor-vec4-ref.vert&testvs=shaders/glsl-features/floor-vec4.vert + +../../glsl-features.html?feature=ceil-frag&reffs=shaders/glsl-features/ceil-ref.frag&testfs=shaders/glsl-features/ceil.frag +../../glsl-features.html?feature=ceil-frag-vec2&reffs=shaders/glsl-features/ceil-vec2-ref.frag&testfs=shaders/glsl-features/ceil-vec2.frag +../../glsl-features.html?feature=ceil-frag-vec3&reffs=shaders/glsl-features/ceil-vec3-ref.frag&testfs=shaders/glsl-features/ceil-vec3.frag +../../glsl-features.html?feature=ceil-frag-vec4&reffs=shaders/glsl-features/ceil-vec4-ref.frag&testfs=shaders/glsl-features/ceil-vec4.frag +../../glsl-features.html?res=8&feature=ceil-vert&refvs=shaders/glsl-features/ceil-ref.vert&testvs=shaders/glsl-features/ceil.vert +../../glsl-features.html?res=8&feature=ceil-vert-vec2&refvs=shaders/glsl-features/ceil-vec2-ref.vert&testvs=shaders/glsl-features/ceil-vec2.vert +../../glsl-features.html?res=8&feature=ceil-vert-vec3&refvs=shaders/glsl-features/ceil-vec3-ref.vert&testvs=shaders/glsl-features/ceil-vec3.vert +../../glsl-features.html?res=8&feature=ceil-vert-vec4&refvs=shaders/glsl-features/ceil-vec4-ref.vert&testvs=shaders/glsl-features/ceil-vec4.vert + +../../glsl-features.html?feature=fract-frag&reffs=shaders/glsl-features/fract-ref.frag&testfs=shaders/glsl-features/fract.frag +../../glsl-features.html?feature=fract-frag-vec2&reffs=shaders/glsl-features/fract-vec2-ref.frag&testfs=shaders/glsl-features/fract-vec2.frag +../../glsl-features.html?feature=fract-frag-vec3&reffs=shaders/glsl-features/fract-vec3-ref.frag&testfs=shaders/glsl-features/fract-vec3.frag +../../glsl-features.html?feature=fract-frag-vec4&reffs=shaders/glsl-features/fract-vec4-ref.frag&testfs=shaders/glsl-features/fract-vec4.frag +../../glsl-features.html?res=8&feature=fract-vert&refvs=shaders/glsl-features/fract-ref.vert&testvs=shaders/glsl-features/fract.vert +../../glsl-features.html?res=8&feature=fract-vert-vec2&refvs=shaders/glsl-features/fract-vec2-ref.vert&testvs=shaders/glsl-features/fract-vec2.vert +../../glsl-features.html?res=8&feature=fract-vert-vec3&refvs=shaders/glsl-features/fract-vec3-ref.vert&testvs=shaders/glsl-features/fract-vec3.vert +../../glsl-features.html?res=8&feature=fract-vert-vec4&refvs=shaders/glsl-features/fract-vec4-ref.vert&testvs=shaders/glsl-features/fract-vec4.vert + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag new file mode 100755 index 000000000000..4efcd9035f8a --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag @@ -0,0 +1,23 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu(float value) { + return value >= 0.0 ? value : -value; +} + +void main() +{ + gl_FragColor = vec4( + abs_emu(vTexcoord.x * 2.0 - 1.0), + abs_emu(vTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert new file mode 100755 index 000000000000..2e618f88b9f3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu(float value) { + return value >= 0.0 ? value : -value; +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(color.x * 2.0 - 1.0), + 0, + abs(color.y * 2.0 - 1.0), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag new file mode 100755 index 000000000000..038567f88c8e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec2 abs_emu(vec2 value) { + return vec2( + abs_emu1(value.x), + abs_emu1(value.y)); +} + +void main() +{ + gl_FragColor = vec4( + 0, + abs_emu(vColor.xy * 2.0 - vec2(1, 1)), + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert new file mode 100755 index 000000000000..80ea90e6f3ff --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec2 abs_emu(vec2 value) { + return vec2( + abs_emu1(value.x), + abs_emu1(value.y)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(vColor.xy * 2.0 - vec2(1, 1)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag new file mode 100755 index 000000000000..005d2f8207d2 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + 0, + abs(vColor.xy * 2.0 - vec2(1, 1)), + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert new file mode 100755 index 000000000000..818e97d96c9f --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(vColor.xy * 2.0 - vec2(1, 1)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag new file mode 100755 index 000000000000..826697392042 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec3 abs_emu(vec3 value) { + return vec3( + abs_emu1(value.x), + abs_emu1(value.y), + abs_emu1(value.z)); +} + +void main() +{ + gl_FragColor = vec4( + abs_emu(vColor.xyz * 2.0 - vec3(1, 1, 1)), + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert new file mode 100755 index 000000000000..2327acb2ae18 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec3 abs_emu(vec3 value) { + return vec3( + abs_emu1(value.x), + abs_emu1(value.y), + abs_emu1(value.z)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag new file mode 100755 index 000000000000..5b5937278b1e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag @@ -0,0 +1,17 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert new file mode 100755 index 000000000000..20fdf67c4f4f --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag new file mode 100755 index 000000000000..c8d5146b75f7 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec4 abs_emu(vec4 value) { + return vec4( + abs_emu1(value.x), + abs_emu1(value.y), + abs_emu1(value.z), + abs_emu1(value.w)); +} + +void main() +{ + gl_FragColor = abs_emu(vColor * 2.0 - vec4(1, 1, 1, 1)); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert new file mode 100755 index 000000000000..2203c94f352c --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert @@ -0,0 +1,36 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float abs_emu1(float value) { + return value >= 0.0 ? value : -value; +} + +vec4 abs_emu(vec4 value) { + return vec4( + abs_emu1(value.x), + abs_emu1(value.y), + abs_emu1(value.z), + abs_emu1(value.w)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = abs_emu(vColor * 2.0 - vec4(1, 1, 1, 1)); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag new file mode 100755 index 000000000000..155c9dad4e7a --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag @@ -0,0 +1,15 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = abs(vColor * 2.0 - vec4(1, 1, 1, 1)); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert new file mode 100755 index 000000000000..2d00173ecac6 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = abs(vColor * 2.0 - vec4(1, 1, 1, 1)); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag new file mode 100755 index 000000000000..1d18baab19bf --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag @@ -0,0 +1,19 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + abs(vTexcoord.x * 2.0 - 1.0), + abs(vTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert new file mode 100755 index 000000000000..4c9a49fc08fa --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + abs(color.x * 2.0 - 1.0), + 0, + abs(color.y * 2.0 - 1.0), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag new file mode 100755 index 000000000000..8127ee6fd479 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag @@ -0,0 +1,15 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vColor; +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert new file mode 100755 index 000000000000..9acf2add41eb --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert @@ -0,0 +1,21 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag new file mode 100755 index 000000000000..34e905a9dcd1 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +void main() +{ + gl_FragColor = vec4( + ceil_emu(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert new file mode 100755 index 000000000000..cf0c76a1cde5 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert @@ -0,0 +1,33 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil_emu(color.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag new file mode 100755 index 000000000000..ba1904f06581 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag @@ -0,0 +1,30 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec2 ceil_emu(vec2 value) { + return vec2( + ceil_emu1(value.x), + ceil_emu1(value.y)); +} + +void main() +{ + gl_FragColor = vec4( + ceil_emu(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert new file mode 100755 index 000000000000..5d6d08ccdd47 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert @@ -0,0 +1,38 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec2 ceil_emu(vec2 value) { + return vec2( + ceil_emu1(value.x), + ceil_emu1(value.y)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag new file mode 100755 index 000000000000..51a3c8be02d9 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + ceil(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert new file mode 100755 index 000000000000..0c665a67c1ae --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag new file mode 100755 index 000000000000..960694f5451a --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag @@ -0,0 +1,31 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec3 ceil_emu(vec3 value) { + return vec3( + ceil_emu1(value.x), + ceil_emu1(value.y), + ceil_emu1(value.z)); +} + +void main() +{ + gl_FragColor = vec4( + ceil_emu(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert new file mode 100755 index 000000000000..2a37961c6d62 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert @@ -0,0 +1,38 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec3 ceil_emu(vec3 value) { + return vec3( + ceil_emu1(value.x), + ceil_emu1(value.y), + ceil_emu1(value.z)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil_emu(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag new file mode 100755 index 000000000000..23d6c439f792 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + ceil(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert new file mode 100755 index 000000000000..9ea299e9c15b --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag new file mode 100755 index 000000000000..18c360f1c0ec --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag @@ -0,0 +1,31 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec4 ceil_emu(vec4 value) { + return vec4( + ceil_emu1(value.x), + ceil_emu1(value.y), + ceil_emu1(value.z), + ceil_emu1(value.w)); +} + +void main() +{ + gl_FragColor = + ceil_emu(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert new file mode 100755 index 000000000000..468a9422e0ca --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert @@ -0,0 +1,38 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float ceil_emu1(float value) { + float m = mod(value, 1.0); + return m != 0.0 ? (value + 1.0 - m) : value; +} + +vec4 ceil_emu(vec4 value) { + return vec4( + ceil_emu1(value.x), + ceil_emu1(value.y), + ceil_emu1(value.z), + ceil_emu1(value.w)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = ceil_emu( + color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag new file mode 100755 index 000000000000..aebacfb784f2 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag @@ -0,0 +1,17 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = + ceil(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert new file mode 100755 index 000000000000..f9053c2babbc --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert @@ -0,0 +1,25 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = ceil( + color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag new file mode 100755 index 000000000000..827e9056fdce --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + ceil(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert new file mode 100755 index 000000000000..ab285b77c391 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + ceil(color.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag new file mode 100755 index 000000000000..90dc7c73c0ed --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag @@ -0,0 +1,23 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu(float value) { + return value - mod(value, 1.0); +} + +void main() +{ + gl_FragColor = vec4( + floor_emu(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert new file mode 100755 index 000000000000..1ae5c1d58e4e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu(float value) { + return value - mod(value, 1.0); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor_emu(color.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag new file mode 100755 index 000000000000..0b0e762421fa --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec2 floor_emu(vec2 value) { + return vec2( + floor_emu1(value.x), + floor_emu1(value.y)); +} + +void main() +{ + gl_FragColor = vec4( + floor_emu(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert new file mode 100755 index 000000000000..27d6e0cbd8ef --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec2 floor_emu(vec2 value) { + return vec2( + floor_emu1(value.x), + floor_emu1(value.y)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag new file mode 100755 index 000000000000..10ce074e7917 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + floor(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert new file mode 100755 index 000000000000..4e786ad1bf6d --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag new file mode 100755 index 000000000000..f2243244726f --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag @@ -0,0 +1,30 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec3 floor_emu(vec3 value) { + return vec3( + floor_emu1(value.x), + floor_emu1(value.y), + floor_emu1(value.z)); +} + +void main() +{ + gl_FragColor = vec4( + floor_emu(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert new file mode 100755 index 000000000000..f79603a1ab6f --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec3 floor_emu(vec3 value) { + return vec3( + floor_emu1(value.x), + floor_emu1(value.y), + floor_emu1(value.z)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor_emu(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag new file mode 100755 index 000000000000..fa1520a3acf3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + floor(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert new file mode 100755 index 000000000000..e6e97a0dd048 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag new file mode 100755 index 000000000000..9769c9d4089e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag @@ -0,0 +1,30 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec4 floor_emu(vec4 value) { + return vec4( + floor_emu1(value.x), + floor_emu1(value.y), + floor_emu1(value.z), + floor_emu1(value.w)); +} + +void main() +{ + gl_FragColor = + floor_emu(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert new file mode 100755 index 000000000000..12b3612a315e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float floor_emu1(float value) { + return value - mod(value, 1.0); +} + +vec4 floor_emu(vec4 value) { + return vec4( + floor_emu1(value.x), + floor_emu1(value.y), + floor_emu1(value.z), + floor_emu1(value.w)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = floor_emu( + color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag new file mode 100755 index 000000000000..bf75bcfbfe44 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag @@ -0,0 +1,17 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = + floor(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert new file mode 100755 index 000000000000..81bef611bf52 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert @@ -0,0 +1,25 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = floor( + color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag new file mode 100755 index 000000000000..8010c3bd3eb1 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + floor(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert new file mode 100755 index 000000000000..570c11d06f01 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + floor(color.x * 8.0 - 4.0) / 8.0 + 0.5, + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag new file mode 100755 index 000000000000..67918fc30753 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag @@ -0,0 +1,23 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu(float value) { + return value - floor(value); +} + +void main() +{ + gl_FragColor = vec4( + fract_emu(vColor.x * 4.0 - 2.0), + 0, 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert new file mode 100755 index 000000000000..8a071474b76d --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu(float value) { + return value - floor(value); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract_emu(color.x * 4.0 - 2.0), + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag new file mode 100755 index 000000000000..6fea00d39084 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec2 fract_emu(vec2 value) { + return vec2( + fract_emu1(value.x), + fract_emu1(value.y)); +} + +void main() +{ + gl_FragColor = vec4( + fract_emu(vColor.xy * 4.0 - vec2(2, 2)), + 0, 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert new file mode 100755 index 000000000000..0fada9b803bc --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec2 fract_emu(vec2 value) { + return vec2( + fract_emu1(value.x), + fract_emu1(value.y)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract(color.xy * 4.0 - vec2(2, 2)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag new file mode 100755 index 000000000000..6806ca5a64c2 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + fract(vColor.xy * 4.0 - vec2(2, 2)), + 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert new file mode 100755 index 000000000000..5156b38f5625 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract(color.xy * 4.0 - vec2(2, 2)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag new file mode 100755 index 000000000000..e09fac3ea28f --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag @@ -0,0 +1,30 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec3 fract_emu(vec3 value) { + return vec3( + fract_emu1(value.x), + fract_emu1(value.y), + fract_emu1(value.z)); +} + +void main() +{ + gl_FragColor = vec4( + fract_emu(vColor.xyz * 4.0 - vec3(2, 2, 2)), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert new file mode 100755 index 000000000000..fc1ab9530d25 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert @@ -0,0 +1,37 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec3 fract_emu(vec3 value) { + return vec3( + fract_emu1(value.x), + fract_emu1(value.y), + fract_emu1(value.z)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract_emu(color.xyz * 4.0 - vec3(2, 2, 2)), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag new file mode 100755 index 000000000000..d9b3bc4ce1f4 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + fract(vColor.xyz * 4.0 - vec3(2, 2, 2)), + 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert new file mode 100755 index 000000000000..12c1e02975d8 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract(color.xyz * 4.0 - vec3(2, 2, 2)), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag new file mode 100755 index 000000000000..4c6b45ac50d6 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag @@ -0,0 +1,30 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec4 fract_emu(vec4 value) { + return vec4( + fract_emu1(value.x), + fract_emu1(value.y), + fract_emu1(value.z), + fract_emu1(value.w)); +} + +void main() +{ + gl_FragColor = + fract_emu(vColor * 4.0 - vec4(2, 2, 2, 2)); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert new file mode 100755 index 000000000000..69f50557f3c0 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert @@ -0,0 +1,36 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float fract_emu1(float value) { + return value - floor(value); +} + +vec4 fract_emu(vec4 value) { + return vec4( + fract_emu1(value.x), + fract_emu1(value.y), + fract_emu1(value.z), + fract_emu1(value.w)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = fract_emu(color * 4.0 - vec4(2, 2, 2, 2)); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag new file mode 100755 index 000000000000..b46769b244c3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag @@ -0,0 +1,16 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = fract(vColor * 4.0 - vec4(2, 2, 2, 2)); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert new file mode 100755 index 000000000000..4e6fd1855346 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = fract(color * 4.0 - vec4(2, 2, 2, 2)); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag new file mode 100755 index 000000000000..d7f14af047fc --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + fract(vColor.x * 4.0 - 2.0), + 0, 0, 1); +} + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert new file mode 100755 index 000000000000..04949277f174 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert @@ -0,0 +1,28 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vec4 color = vec4( + aTexcoord, + aTexcoord.x * aTexcoord.y, + (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); + vColor = vec4( + fract(color.x * 4.0 - 2.0), + 0, + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag new file mode 100755 index 000000000000..305993926348 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag @@ -0,0 +1,26 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +void main() +{ + gl_FragColor = vec4( + sign_emu(vTexcoord.x * 2.0 - 1.0), + sign_emu(vTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert new file mode 100755 index 000000000000..f8fd8dd74d9e --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign_emu(aTexcoord.x * 2.0 - 1.0), + sign_emu(aTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag new file mode 100755 index 000000000000..682abf2b08c3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag @@ -0,0 +1,31 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec2 sign_emu(vec2 value) { + return vec2( + sign_emu1(value.x), + sign_emu1(value.y)); +} + +void main() +{ + gl_FragColor = vec4(sign_emu( + vTexcoord * 2.0 - vec2(1, 1)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert new file mode 100755 index 000000000000..c332114eb6d3 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec2 sign_emu(vec2 value) { + return vec2(sign_emu1(value.x), sign_emu1(value.y)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign_emu(aTexcoord * 2.0 - vec2(1, 1)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag new file mode 100755 index 000000000000..24fc3786cb94 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4(sign( + vTexcoord * 2.0 - vec2(1, 1)), + 0, + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert new file mode 100755 index 000000000000..3bab936c7020 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert @@ -0,0 +1,23 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign(aTexcoord * 2.0 - vec2(1, 1)), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag new file mode 100755 index 000000000000..1f9689f05e27 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec3 sign_emu(vec3 value) { + return vec3( + sign_emu1(value.x), + sign_emu1(value.y), + sign_emu1(value.z)); +} + +void main() +{ + gl_FragColor = vec4(sign_emu(vec3( + 0, + vTexcoord * 2.0 - vec2(1, 1))), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert new file mode 100755 index 000000000000..cb5ea493ddd2 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert @@ -0,0 +1,31 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec3 sign_emu(vec3 value) { + return vec3(sign_emu1(value.x), sign_emu1(value.y), sign_emu1(value.z)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign_emu(vec3(0, aTexcoord * 2.0 - vec2(1, 1))), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag new file mode 100755 index 000000000000..06681aae0980 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag @@ -0,0 +1,18 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4(sign(vec3( + 0, + vTexcoord * 2.0 - vec2(1, 1))), + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert new file mode 100755 index 000000000000..a37660e5b10b --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert @@ -0,0 +1,22 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign(vec3(0, aTexcoord * 2.0 - vec2(1, 1))), + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag new file mode 100755 index 000000000000..27b6bdb5f583 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag @@ -0,0 +1,32 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec4 sign_emu(vec4 value) { + return vec4( + sign_emu1(value.x), + sign_emu1(value.y), + sign_emu1(value.z), + sign_emu1(value.w)); +} + +void main() +{ + gl_FragColor = sign_emu(vec4( + vTexcoord.yx * -2.0 + vec2(1, 1), + vTexcoord * 2.0 - vec2(1, 1))); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert new file mode 100755 index 000000000000..80fcad195970 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert @@ -0,0 +1,35 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +float sign_emu1(float value) { + if (value == 0.0) return 0.0; + return value > 0.0 ? 1.0 : -1.0; +} + +vec4 sign_emu(vec4 value) { + return vec4( + sign_emu1(value.x), + sign_emu1(value.y), + sign_emu1(value.z), + sign_emu1(value.w)); +} + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = sign_emu(vec4( + aTexcoord.yx * -2.0 + vec2(1, 1), + aTexcoord * 2.0 - vec2(1, 1))); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag new file mode 100755 index 000000000000..07804592ee2a --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag @@ -0,0 +1,17 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = sign(vec4( + vTexcoord.yx * -2.0 + vec2(1, 1), + vTexcoord * 2.0 - vec2(1, 1))); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert new file mode 100755 index 000000000000..7165ae3ef943 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert @@ -0,0 +1,22 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = sign(vec4( + aTexcoord.yx * -2.0 + vec2(1, 1), + aTexcoord * 2.0 - vec2(1, 1))); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag new file mode 100755 index 000000000000..6ead9a068612 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag @@ -0,0 +1,19 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +precision mediump float; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_FragColor = vec4( + sign(vTexcoord.x * 2.0 - 1.0), + sign(vTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert new file mode 100755 index 000000000000..6be8b9d4b8c9 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +attribute vec4 aPosition; +attribute vec2 aTexcoord; + +varying vec2 vTexcoord; +varying vec4 vColor; + +void main() +{ + gl_Position = aPosition; + vTexcoord = aTexcoord; + vColor = vec4( + sign(aTexcoord.x * 2.0 - 1.0), + sign(aTexcoord.y * 2.0 - 1.0), + 0, + 1); +} + + + + diff --git a/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt b/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt index 3bcf92e5ba47..1fd1c5c6e583 100644 --- a/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt +++ b/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt @@ -1,3 +1,5 @@ non-ascii.vert non-ascii-comments.vert +shared.vert shared-a.frag +shared.vert shared-b.frag diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag b/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag new file mode 100755 index 000000000000..73ca3c8a0992 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag @@ -0,0 +1,34 @@ +// shared fragment shader should succeed. +precision mediump float; +uniform vec4 lightColor; +varying vec4 v_position; +varying vec2 v_texCoord; +varying vec3 v_surfaceToLight; + +uniform vec4 ambient; +uniform sampler2D diffuse; +uniform vec4 specular; +uniform float shininess; +uniform float specularFactor; +// #fogUniforms + +vec4 lit(float l ,float h, float m) { + return vec4(1.0, + max(l, 0.0), + (l > 0.0) ? pow(max(0.0, h), m) : 0.0, + 1.0); +} +void main() { + vec4 diffuseColor = texture2D(diffuse, v_texCoord); + vec4 normalSpec = vec4(0,0,0,0); // #noNormalMap + vec3 surfaceToLight = normalize(v_surfaceToLight); + vec3 halfVector = normalize(surfaceToLight); + vec4 litR = lit(1.0, 1.0, shininess); + vec4 outColor = vec4( + (lightColor * (diffuseColor * litR.y + diffuseColor * ambient + + specular * litR.z * specularFactor * normalSpec.a)).rgb, + diffuseColor.a); + // #fogCode + gl_FragColor = outColor; +} + diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag b/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag new file mode 100755 index 000000000000..77b4a76d7a9c --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag @@ -0,0 +1,31 @@ +// shared fragment shader should succeed. +precision mediump float; +varying vec4 v_position; +varying vec2 v_texCoord; +varying vec3 v_surfaceToLight; + +// #fogUniforms + +vec4 lit(float l ,float h, float m) { + return vec4(1.0, + max(l, 0.0), + (l > 0.0) ? pow(max(0.0, h), m) : 0.0, + 1.0); +} +void main() { + vec4 normalSpec = vec4(0,0,0,0); // #noNormalMap + vec4 reflection = vec4(0,0,0,0); // #noReflection + vec3 surfaceToLight = normalize(v_surfaceToLight); + vec4 skyColor = vec4(0.5,0.5,1,1); // #noReflection + + vec3 halfVector = normalize(surfaceToLight); + vec4 litR = lit(1.0, 1.0, 10.0); + vec4 outColor = vec4(mix( + skyColor, + vec4(1,2,3,4) * (litR.y + litR.z * normalSpec.a), + 1.0 - reflection.r).rgb, + 1.0); + // #fogCode + gl_FragColor = outColor; +} + diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared.vert b/content/canvas/test/webgl/conformance/shaders/misc/shared.vert new file mode 100755 index 000000000000..0acfbd2975c6 --- /dev/null +++ b/content/canvas/test/webgl/conformance/shaders/misc/shared.vert @@ -0,0 +1,41 @@ +// shared vertex shader should succeed. +uniform mat4 viewProjection; +uniform vec3 worldPosition; +uniform vec3 nextPosition; +uniform float fishLength; +uniform float fishWaveLength; +uniform float fishBendAmount; +attribute vec4 position; +attribute vec2 texCoord; +varying vec4 v_position; +varying vec2 v_texCoord; +varying vec3 v_surfaceToLight; +void main() { + vec3 vz = normalize(worldPosition - nextPosition); + vec3 vx = normalize(cross(vec3(0,1,0), vz)); + vec3 vy = cross(vz, vx); + mat4 orientMat = mat4( + vec4(vx, 0), + vec4(vy, 0), + vec4(vz, 0), + vec4(worldPosition, 1)); + mat4 world = orientMat; + mat4 worldViewProjection = viewProjection * world; + mat4 worldInverseTranspose = world; + + v_texCoord = texCoord; + // NOTE:If you change this you need to change the laser code to match! + float mult = position.z > 0.0 ? + (position.z / fishLength) : + (-position.z / fishLength * 2.0); + float s = sin(mult * fishWaveLength); + float a = sign(s); + float offset = pow(mult, 2.0) * s * fishBendAmount; + v_position = ( + worldViewProjection * + (position + + vec4(offset, 0, 0, 0))); + v_surfaceToLight = (world * position).xyz; + gl_Position = v_position; +} + diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html index 5c3c5f021d43..acf9ef605573 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html @@ -1,10 +1,12 @@ + + @@ -184,6 +186,7 @@ gl.clearDepth(1); textureLoc = gl.getUniformLocation(program, "tex"); runTest(); +glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); successfullyParsed = true; diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html new file mode 100644 index 000000000000..ba22f1334c8f --- /dev/null +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html @@ -0,0 +1,115 @@ + + + + + + + + + + + + + +
+
+ + + + diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html index 0fba1a09bd3d..bc39b1cc0837 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html @@ -1,10 +1,12 @@ + + @@ -122,6 +124,7 @@ function runTest() runOneIteration(true, false, true, greenPremultiplyAlpha, redPremultiplyAlpha); + glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html index 7d9b7b62e9df..0b9d73dfd870 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html @@ -1,10 +1,12 @@ + + @@ -14,6 +16,7 @@ var wtu = WebGLTestUtils; var gl = null; var textureLoc = null; var successfullyParsed = false; +var imgCanvas; function init() { @@ -30,7 +33,7 @@ function init() gl.clearColor(0,0,0,1); gl.clearDepth(1); - textureLoc = gl.getUniformLocation(gl.program, "tex"); + textureLoc = gl.getUniformLocation(program, "tex"); wtu.loadTexture(gl, "resources/red-green.png", runTest); } @@ -82,15 +85,47 @@ function runOneIteration(image, useTexSubImage2D, flipY, topColor, bottomColor) "shouldBe " + topColor); } -function runTest(image) -{ +function runTestOnImage(image) { var red = [255, 0, 0]; var green = [0, 255, 0]; runOneIteration(image, false, true, red, green); runOneIteration(image, false, false, green, red); runOneIteration(image, true, true, red, green); runOneIteration(image, true, false, green, red); +} +function runTest(image) +{ + runTestOnImage(image); + + imgCanvas = document.createElement("canvas"); + imgCanvas.width = 1; + imgCanvas.height = 2; + var imgCtx = imgCanvas.getContext("2d"); + imgCtx.drawImage(image, 0, 0); + + // apparently Image is different than . + var newImage = new Image(); + newImage.onload = function() { + runTest2(newImage); + }; + newImage.src = imgCanvas.toDataURL(); +} + +function runTest2(image) { + runTestOnImage(image); + + var newImage = document.createElement("img"); + newImage.onload = function() { + runTest3(newImage); + }; + newImage.src = imgCanvas.toDataURL(); +} + +function runTest3(image) { + runTestOnImage(image); + + glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html index c87ffc172e6a..968f9b7c93b8 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html @@ -1,10 +1,12 @@ + + @@ -30,11 +32,12 @@ function init() gl.clearColor(0,0,0,1); gl.clearDepth(1); - textureLoc = gl.getUniformLocation(gl.program, "tex"); + textureLoc = gl.getUniformLocation(program, "tex"); var video = document.getElementById("vid"); video.addEventListener( "playing", function() { runTest(video); }, true); + video.loop = true; video.play(); } @@ -104,6 +107,7 @@ function runTest(videoElement) runOneIteration(videoElement, true, true, red, green); runOneIteration(videoElement, true, false, green, red); + glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html b/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html index c50ef343f34a..6b4491a547f3 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html b/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html index 8f56a3d80e5d..bbd2fe216290 100644 --- a/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html +++ b/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html b/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html index ebe1c7c317e5..bbfaea6cf587 100644 --- a/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html +++ b/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html @@ -1,8 +1,8 @@ - + - - texImage2D and texSubImage2D tests with invalid data + + texImage2D and texSubImage2D tests with invalid data @@ -95,8 +95,6 @@ debug(""); successfullyParsed = true; - diff --git a/content/canvas/test/webgl/conformance/tex-input-validation.html b/content/canvas/test/webgl/conformance/tex-input-validation.html index 1ec16031f209..be03d24ea475 100644 --- a/content/canvas/test/webgl/conformance/tex-input-validation.html +++ b/content/canvas/test/webgl/conformance/tex-input-validation.html @@ -1,10 +1,12 @@ + + diff --git a/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html b/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html index d197777844e9..7b67cad5a33c 100644 --- a/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html +++ b/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html @@ -1,5 +1,7 @@ + + diff --git a/content/canvas/test/webgl/conformance/tex-sub-image-2d.html b/content/canvas/test/webgl/conformance/tex-sub-image-2d.html index 8bef5fcebbc9..f7058265f1f4 100644 --- a/content/canvas/test/webgl/conformance/tex-sub-image-2d.html +++ b/content/canvas/test/webgl/conformance/tex-sub-image-2d.html @@ -1,18 +1,19 @@ + + @@ -30,9 +30,8 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/texture-active-bind-2.html b/content/canvas/test/webgl/conformance/texture-active-bind-2.html index b7e15acc060c..3ae2e4b37592 100644 --- a/content/canvas/test/webgl/conformance/texture-active-bind-2.html +++ b/content/canvas/test/webgl/conformance/texture-active-bind-2.html @@ -1,12 +1,12 @@ - + + WebGL ActiveTexture BindTexture conformance test #2 @@ -29,9 +29,8 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/texture-complete.html b/content/canvas/test/webgl/conformance/texture-complete.html index 0b4b3c748bb9..365e10fd986c 100644 --- a/content/canvas/test/webgl/conformance/texture-complete.html +++ b/content/canvas/test/webgl/conformance/texture-complete.html @@ -1,12 +1,12 @@ - + + WebGL "Texture Complete" texture conformance test. diff --git a/content/canvas/test/webgl/conformance/texture-formats-test.html b/content/canvas/test/webgl/conformance/texture-formats-test.html index aba54bd2f8a6..724913370ea6 100644 --- a/content/canvas/test/webgl/conformance/texture-formats-test.html +++ b/content/canvas/test/webgl/conformance/texture-formats-test.html @@ -1,13 +1,12 @@ - + - + WebGL Texture Format Conformance Tests @@ -248,8 +247,5 @@ successfullyParsed = true; - - diff --git a/content/canvas/test/webgl/conformance/texture-npot-video.html b/content/canvas/test/webgl/conformance/texture-npot-video.html new file mode 100644 index 000000000000..0ad894b2f97d --- /dev/null +++ b/content/canvas/test/webgl/conformance/texture-npot-video.html @@ -0,0 +1,156 @@ + + + + + + + + + + + +
+
+ + + diff --git a/content/canvas/test/webgl/conformance/texture-npot.html b/content/canvas/test/webgl/conformance/texture-npot.html index 146bda44d3f2..b81163827b68 100644 --- a/content/canvas/test/webgl/conformance/texture-npot.html +++ b/content/canvas/test/webgl/conformance/texture-npot.html @@ -1,12 +1,12 @@ - + + WebGL Non-Power of 2 texture conformance test. @@ -29,9 +29,7 @@ void main() - - - diff --git a/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html b/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html index fb9733273d4b..f8a3c2aa642d 100644 --- a/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html +++ b/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/triangle.html b/content/canvas/test/webgl/conformance/triangle.html index 5637b42960f3..1e4550b49898 100644 --- a/content/canvas/test/webgl/conformance/triangle.html +++ b/content/canvas/test/webgl/conformance/triangle.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/uniform-location.html b/content/canvas/test/webgl/conformance/uniform-location.html index 802249aadb6b..343d42a76fae 100644 --- a/content/canvas/test/webgl/conformance/uniform-location.html +++ b/content/canvas/test/webgl/conformance/uniform-location.html @@ -1,5 +1,5 @@ + + diff --git a/content/canvas/test/webgl/conformance/uniform-samplers-test.html b/content/canvas/test/webgl/conformance/uniform-samplers-test.html index fe26e1d7e2a4..d43005a7303b 100644 --- a/content/canvas/test/webgl/conformance/uniform-samplers-test.html +++ b/content/canvas/test/webgl/conformance/uniform-samplers-test.html @@ -1,12 +1,12 @@ - + + WebGL sampler uniforms conformance test. @@ -55,12 +55,7 @@ function init() init(); successfullyParsed = true; - - - - diff --git a/content/canvas/test/webgl/conformance/uninitialized-test.html b/content/canvas/test/webgl/conformance/uninitialized-test.html index 38accd463b42..fee8628a09b3 100644 --- a/content/canvas/test/webgl/conformance/uninitialized-test.html +++ b/content/canvas/test/webgl/conformance/uninitialized-test.html @@ -1,7 +1,7 @@ - + - + WebGL Uninitialized GL Resources Tests diff --git a/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html b/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html index a88ba9250f6e..5af19fc3d273 100644 --- a/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html +++ b/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html @@ -1,10 +1,11 @@ + diff --git a/content/canvas/test/webgl/conformance/webgl-specific.html b/content/canvas/test/webgl/conformance/webgl-specific.html index 61a1f846f44d..53e2ea0feabe 100644 --- a/content/canvas/test/webgl/conformance/webgl-specific.html +++ b/content/canvas/test/webgl/conformance/webgl-specific.html @@ -1,12 +1,12 @@ - + + WebGL GLES2 difference test. @@ -92,6 +92,10 @@ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE); shouldBe("gl.getParameter(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL)", "gl.NONE"); glErrorShouldBe(gl, gl.NO_ERROR, "set/get UNPACK_COLORSPACE_CONVERSION_WEBGL should generate no error"); +debug(""); +debug("Verify that drawingBufferWidth and drawingBufferHeights are implemented"); +shouldBeTrue("gl.drawingBufferWidth >= 0 && gl.drawingBufferHeight >= 0"); + successfullyParsed = true; diff --git a/content/canvas/test/webgl/extra/big-fbos-example.html b/content/canvas/test/webgl/extra/big-fbos-example.html index 38ba6eb90019..3a07f1aa2ada 100644 --- a/content/canvas/test/webgl/extra/big-fbos-example.html +++ b/content/canvas/test/webgl/extra/big-fbos-example.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL Big FBO Test diff --git a/content/canvas/test/webgl/extra/canvas-compositing-test.html b/content/canvas/test/webgl/extra/canvas-compositing-test.html index da658e4fccd4..07d8c258faed 100644 --- a/content/canvas/test/webgl/extra/canvas-compositing-test.html +++ b/content/canvas/test/webgl/extra/canvas-compositing-test.html @@ -26,6 +26,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Canvas Compositing Test diff --git a/content/canvas/test/webgl/extra/fbo-lost-context.html b/content/canvas/test/webgl/extra/fbo-lost-context.html index 43ab698fd789..abc229cf8888 100644 --- a/content/canvas/test/webgl/extra/fbo-lost-context.html +++ b/content/canvas/test/webgl/extra/fbo-lost-context.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL FBO Lost Context Test diff --git a/content/canvas/test/webgl/extra/lots-of-polys-example.html b/content/canvas/test/webgl/extra/lots-of-polys-example.html index a92f6daa1c20..95b5846a8251 100644 --- a/content/canvas/test/webgl/extra/lots-of-polys-example.html +++ b/content/canvas/test/webgl/extra/lots-of-polys-example.html @@ -7,6 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> + WebGL Lots of polygons example. @@ -33,6 +34,9 @@ function init() { function main() { var wtu = WebGLTestUtils; var canvas = document.getElementById("example"); + canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false); + canvas.addEventListener("webglcontextrestored", function(e) { }, false); + var gl = wtu.create3DContext(canvas); var program = wtu.setupTexturedQuad(gl); diff --git a/content/canvas/test/webgl/extra/out-of-memory.html b/content/canvas/test/webgl/extra/out-of-memory.html index a3392f85427d..df6a163bbddb 100644 --- a/content/canvas/test/webgl/extra/out-of-memory.html +++ b/content/canvas/test/webgl/extra/out-of-memory.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL Out Of Memory Test diff --git a/content/canvas/test/webgl/extra/out-of-resources.html b/content/canvas/test/webgl/extra/out-of-resources.html index 8fee5b0e84e8..7275ccf4d21c 100644 --- a/content/canvas/test/webgl/extra/out-of-resources.html +++ b/content/canvas/test/webgl/extra/out-of-resources.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL Out Of Resources Test diff --git a/content/canvas/test/webgl/extra/slow-shader-example.html b/content/canvas/test/webgl/extra/slow-shader-example.html index fe64e90f9ae4..549983257b71 100644 --- a/content/canvas/test/webgl/extra/slow-shader-example.html +++ b/content/canvas/test/webgl/extra/slow-shader-example.html @@ -7,6 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> + WebGL Slow Shader example. @@ -18,9 +19,7 @@ found in the LICENSE file.
- - diff --git a/content/canvas/test/webgl/extra/webgl-info.html b/content/canvas/test/webgl/extra/webgl-info.html index 5f93f1b29146..5a443d4e5adf 100644 --- a/content/canvas/test/webgl/extra/webgl-info.html +++ b/content/canvas/test/webgl/extra/webgl-info.html @@ -7,6 +7,7 @@ Use of this source code is governed by a BSD-style license that can be "http://www.w3.org/TR/html4/loose.dtd"> + WebGL Information + + + + +- ++ + + +diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html +--- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html ++++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html +@@ -154,11 +154,11 @@ void main() + vec4 c = texture2D(Texture, texCoord0.st); + gl_FragColor = c; + } + + + + + +- ++ + + +diff --git a/content/canvas/test/webgl/conformance/origin-clean-conformance.html b/content/canvas/test/webgl/conformance/origin-clean-conformance.html +--- a/content/canvas/test/webgl/conformance/origin-clean-conformance.html ++++ b/content/canvas/test/webgl/conformance/origin-clean-conformance.html +@@ -118,11 +118,11 @@ window.onload = function() { + } @@ -24,12 +59,11 @@ diff --git a/conformance/origin-clean-conformance.html b/conformance/origin-clea
- -- -+ +- ++ -diff --git a/resources/opengl_logo.jpg b/resources/opengl_logo.jpg +diff --git a/content/canvas/test/webgl/resources/opengl_logo.jpg b/content/canvas/test/webgl/resources/opengl_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3b70bef3f2c78736c72e263b63acea8d9a9467a GIT binary patch @@ -146,3 +180,1237 @@ z=iUN*6P526MKx5(vuDYuK<94#%&o^t6+xl8o=z}hPU9RN<*>do6PDn#f)9kB0;Q;! zfYcVwLp^QywE1HHD8c{Rm?Wo&8P70Va(zMpZ`|| I?(NKf0MJeN7XSbN +diff --git a/content/canvas/test/webgl/resources/thunderbird-logo-64x64.png b/content/canvas/test/webgl/resources/thunderbird-logo-64x64.png +new file mode 100644 +index 0000000000000000000000000000000000000000..e2326f5510a0d2f89601c62459032be9d64585da +GIT binary patch +literal 63843 +zc$|!OWm6nX*Yx7<4vV{Mkl-4e0KwfMxI2q$aCZxm;1VF%BEey?1b25^U~!)7uJ;eT +zAEu^irsqu0sWYcL?z8$QEOc^o004lcq$sBa0KftMH&BuPn~XiGZ2^EsHYGXfFMca$ +z!6*eLHo0$}F2$yNj6Fj5bJeMAL-64&4`y%_jU8-0QR}}r^@+WmOX@pny5c)&;>%h? +zaTTkT6fbib<^#L<+uJ=M@4=gw1)kGAxo8~;m^QsHE*FJH>aQDz!5dEwIly!)k8XC9Nn_W@ROx{K?NIos!uRdv0A08Ke*g`onm4|Z*Mql3 +z>h0%+qc)3lxew|$srghnN4t5zhV}nJ!ZdF--aGIseTaI3s@9qcu>HE*>ApM_?lo*m +z^39G2iI{d-;R8%7%AaK4*8zjwvpkdenDdcJ?c)LfelY+hRzcy~)2kiR6DjkEBj~@& +zYn%j3VKvD12UDFc8-13pE1Q>*`h?I+)kTzk!P +zhU*xhG*cQo8swX&QB;ZaJ&qK7&mcib1W&C8=8*|OCb%sf9^#Obix$=S?(E23%_9k= +z-qLwc2zB#dxuV#+fMwnLyyE4p#%+^&(&AzcVkjEbgaoW>)obuU;52aIrP4lxI7D(z +z+(ND>2!6IV&~{F*i|I-KKOV0C@jy)c_wIEmh7TQ4I-MrzoHpDPhTVi1Am1UrZ-5&$#4&}?h8 +zVU@jakKj@E`l6*clDmrXOZbpDk385^wzP=x&pehMWl_I>Et_`s=x!Tk0CW%RP8wZ+ +zmw6J6fJViU8$2Hrzj1HLHVcIpJyVS+zFXNLtXoAt*_yyMu{N610(g9cKNl=&IE3S2(2Ca-uEC7=joFslQp4Zwl;_O>p@j??c#>&}h +zmihfq`60-cB074svW|59<>-#=?5W}ZMFIXVN@DxlYUiQS!{UI)Jy}+ZM)#`(4qqHc +z(p!MI!m8PWKX$&P*n(gd=%QVcU##dFUi2{xNc!y9wT! +zCJitUw6n#c*Q-0k9i6>C`lH|>VggWpgEajpqqid^n-|#mU8~SA^`LDQGNQ7vxaa4c +zqy%`NNKWW|R{S+mE-r5vBHz@aA^#+P^K>OXZD9^OkTnqNZS|vI4my(@56}FikxMnL +zboDR;J7U6g4!&hJaC#TM8Q>lehNb(4H2Q+H?Y_Q(ebfuz7ILYd#=w!KkJ(aCPFld% +z88uI;Fi4QUbIylO7b#}BIfI#FVY#hi@xcI%w*za2kn^Xa`qP(>s>MUcqMWy;#YOy2 +zW8KG-`wy<=>5!I+yUk6>XV1xoN4jPUgT_m$tGcP}sec398`g7WWAIbPe=HE>)< +zlk3%{g#D&>M{SafGy4}dJ3-)k4Bz4-w5+r3j{uFCMYV!hZRj0M?cRDjgB>S(QXV+p^y>nXV4 +zgp%RnWcneX5w}PQ9AGpCgHvCV0phc0X}vsk&x%R|^{i?wv$d1b%du5@$$zE%zoaJC +zfZDeG^L8CG+c&)mg843$aK&h;=}gL(o_1qWNnH%H`=b-q!IHbhpcdiJn%=Q-;X8sQq`rov0&4+vih%HPIc +zQ6b?LhW$-HFbf)Ae=*@aVl0U@-vmj7I)VdO)w|As*7&TgUP{NtbkpM{0Zs73WcXNAl4T^D;PWK_s%TIJ!_+b+#6m;vyx>WEI +zE<5TqRebht=ah)%pH6}&#a0PrT(gpgGgg;!l#HgoeViV;9%Fvj5&+E}x_q8VvOvCp +zo%38lAJU6AL}y`dzdrttEO~LS?}S)h`jj%XE3)_K7x&(Xr(_^{%%ZD8NiE@6Bo5I( +z+JgJ6{c3S%I4}4xAetnoA<&N5=WP+;;V;NEqQb6r;NFCCXc%Hc(3<$W<+j#+$DCVL;J +z39Go!i|&o+e_~#F{V3^t$|&vXW%L_v +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 +zeNHiCK7#A=dg`|mYoOhqHIu9X< +z_-qn<{K0N(b`x%(HuQr<@NGz9J+1PW5MMUdfrdmpq(-%G1w8oh(sQwA`*yS+YW2It +z*TNy`QAk-aY>MHQ=(-2V=eJgBrlu$D0>3}Wctu!b@{+aE0i4qLr*z?~fH9A%z1O@1rt(*H!{KII!ZA>gg2d9wNqJ(@t +z)(h8qiICuk>n{Z-Nvg}D@rD}CM+n0$Eyw{`@!kg9%q-qPcfO2haDh+GQl7*5$6cSp +zbu4wR{KfOUu~bX1Ic91Nda@4J+hAk@!a~J`9{6QY7V|5=59}>CH!HisFabDS*heIe +z#Rma8xj$#$_s#=3b^CDy>Gzh-pfee)sfxBu-e%mn@Po?FMu*n=N^+RE +z@r*3EdoW9ehcm_7=bKr?v5W7)e;3{8GTtGtn}L@f2*fwv+jqUu02P;=yAcBHm)3dH +zf)Z6fJ>(5nQ>F1}h%wa|CsbU(m4|!FqqcEmdy!AFG9a`yuhad9K4vZ{Kj8zyveDZT +zl3I)1+t*eXj9wLUtnAOp^Nj6{jl;iCW3Z^|gF=$Nqf9x!eT +zHSv>;*mI#I*ArRaE|%Lp>SA}!DP;hg2d +z0mo>!SrX>=4xZThWgax%e7cvSLiNdrh6HC1QsR{5=lw&(TrGsbII9EF%Y?AFgj8jj +z-n$r=uA70lBG`NWbtgh-+Qj8UZsl$O?kyYwc=qYqF8$UuktLW*q4*)uvyitNHaaJwYl(-@>lK!e#uMv +z#sTlM%B@@d`^u3P%jVIkW<(WxF6N_@Ej@g&+Pvs0K3e2)hd>SH?-JrZHso>Te?@cE +z)+21>mjz_Quv^)ody#Q-U-}Q6YNHuBVUZK*%VV~IXPL><@tc7(XC;9&NnDV6LP#>N +zuWq;N2F@X}0DeN(mYOFL%To-#uxeg+IWrx$Dl)0)&dwLg6@P?ADE?LnItZd_`_)7w +z$tO~0HY>BhT9o~F +z=KXRcWa^e+Ur0l1z_p~FDbnF?A0M59QnjSUIZ~kK=BGT=tvq7%_!FI5p;mYy{x +zfaI)Q@#!2gLdGg_vy}!Vj$166!hEy2lu{+H@VQl}3#XlE(gT7?5tbgFY7JLHmlHGn +zELA9w2b4s7Mk1Sfr_Ix+j_V7Myty!J7f1OK4Apeds5kG+B|D$?;vvBLvp>JGcT|H{5rkJ0kNArhO&+-+}Y +z-u}YsSG4gjG}XDGP%^*XQCRD_Xklq!tBA{&kMCXO%aekXJ&Eua>l$rcv7^HhGm~9A +zLc`%0WCw~E&eMVFO4OoL#8g;Ff~?d5zo!!%!T@2}Oru%PS< +zwP|xq*>WX3>mN6=60IXm0m$Dz;y06{^*lxnb!bNzG?JxsuwCam7cO;o8Np#YN7CcH +z^vv4lU6jIqN&e(15C~!Gc-rbx&rp?8Hx0Nww!MDx^pXk-Ws;ZCgy-Nbu7&>m?l^Xb +z04%$mhpmhf#?9QZG@#RBK;Iyu5^l?K6T>QG4Gw^uz(H4tM&;cd(9w2$nk{ox5mIcx +zsm?Z7_B=3q92X|#R#@o!{U1uF0xo5I+`?gu^5`@zdD8YuazVo7>qEp5WfH9#{vcq6 +zScwhG#jvg+QDz0CTJW0FY$Qsl=Rn)$Xk~4t@N7BPrrff#;TCVbCA_HrQ1fElf*i3G +z`73lWA?piySDCw#_lMzI?md1Sl_3R~;h1=oEP1>k_6G;f;r-tWA44H>+f0S6y9$;% +zXAdpE#6(9sLZg%OHxE%46ZmTxEq3}y`8=?-plTRs?NyCU6=FSz8 +zPnvZ-cihD|_p=SG5>|Q?y?;BahQCa2h@xz>=DDA9#i3%9m#Ivw;_H*h6%BmbjaXD| +z{nowYHwE8^R{Z<<1rZGt>B2&i}j3<5>%S35ctnIJ&CB_UDUU+!bH3vPp +z>^rAIXSw1he*b=7$DpZ-$K&T;(vp>#$nxf-Yfr~HLdkNGEBT!h7eeT;sr16a;56WF +z+0BK8-9eL}RaPJCtf|V8M-~7Y340VzLcY`Yf0>ktjzwz4&$)TawfK@1^W8dIHVPjP +zP=Ife>!mx7Z4~Nf#%WT1bdnrzm4uWk8(iRK1tYYUwnk2AKnWE-(r<~0lXi=3O0e(v +zNUJR%{7eS#rLID}IB16mfZfzoueVKPbXwJRh`gKqn5fPIP-tbHg +zv34ygNE^Rlf6IDiyYZsPWWD +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 +z3qrrW0N;I3I#Yr`ynZstC +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 +zaV-Vo1fW?5_}`bfJ`%lp+jsf9s>WMXv=ly`I +z2H!Wpp_xY;51^Nob>;1CLzAI}7@&{M;&V&6Ugre5@V7IQj^m$~OKgSF21T|Ct$%K( +z9bLUbeyui>Kyd~8VG*a%C<+-SAH1}EV_L^9i^rinCfZ)a(pzl||5FZ5yH9p}2BV&X +zSZVr2kT4w(oOuk}Sq1yBb<>w?Ns1WRw+&i|Q4uY0DYibK3Sad4sn>A~kNLE7@Vo3$ +z7Di`km^WYo8;Mb0cdcR?9qgD7AU|p2&6q`=eY$v%b&`LDlvvCMvg?JaMWYA-GZ}}8 +zCx4`(_oe)Lh%>Ra8F@UfPOSZ;XfE*=IJ~t@`{M{Bo$gw{iqjD%N7-*_drV$lOy7S$ +zJ^;l7$Lo?y>vOQh-bOdP2>gJ;%6$+rA~M^P3l3}Ifud9JeXmCM4tBpD5@7B2&>1Ce +zhkJVmBWbmHH<`U%c$b@vgGObAj()#~wk-Ov#{pa2h#w*OtpY8-$dRDSKx;=e4{?ma +zBc>=c706^l=%poUlcqm?@jM7{o5$&mpV)x;{89LFdP(R|)gw-?XzMkCF*Ps>XxyKr +zKXRoAoZL2PYgmS~CE%R}+D?BKOcWl1Rl&}r>@>cp +z!kHpwOaw48{V6OG&@0D2{2xR#wbQUupk|14tk +z)2i;)nCn?EqmAnT+!h9oGdS&NZCw>+umfq3x0cL2*k!Myy4O*afii{#1)_rXGIXW +zpjo=Dt5J`{NCbY^(fk!^JqH(B;1{AZudaRbQq25ROhb{?vncnIIMq*fqMJ-s1HL0@0ZcIfd7b8yIpLE^7dHgjPJ~u{o8KVffpLZe)1IY>cW5* +zXvFH!^~iCradrRitu?Bzg9m~?SPwgRHv2xvk?C>$%>LG}?S>A1U*{To+Kr^XKUbf%yM9swj75QP$)Br8v(SheRpFn`_F76gO)9jSO;l3$ +zIohmzQFf4Nnk`eUN!UvFPywR1XIbl&rGUs|m`v&YFL)r+jsJ_!05*R^SU=(gs7xu> +zBaO^OnQ7P9lG@Yui&A1l2CC63<(aZHcT;lxdT{Km!mP9wH7^mWaApdZL3V5;7U16d +z7og9xHM=D_MZ_CV#yeAAvlN(=Cfi?e=!J(v0Hr)}l%&uIdCk>Req$m8^ftRZPyML% +z$0!#SayDni3$$Do4Qv(XsH^&&Fj+gSybl~_{R!I|L}>)MHhh+igSC(ZR8u^K-Gw9B +zSVxDv?5GQTNnK89skv5ls62-Lq(~og#}Ps%;3FjNCUca0)jlH2MEye$V5diFQ4bK% +zS)hd8yxnV_1vML>QElp9q=FlwNTsO77)F6E5)(@?utn$LG7*Q#oKyKBFYXgNgy%AT +zx3_l4pZJ!AoxJ3t1UU}I^unoZ$+OFWN(k*WW>>oDnj=Pz73!8s`775pNW|g&nlv`M +zPk0WaXI}*VF!E*))tffd=$gs=-|-rP38O=zWN@@UnBG8& +zk;4Oc7%tDB!2d19p-x^j$QMMPJ%`m=Xfmfe{$)a6=|WP-i6$&C#8XsI!kbXqJq +zNWE2^F=Z7>51^lyLg}L>TY4JyUH}Kv0Q@ZWBLasX26W?t?{#cP|#tJ%yO +z$sHD9u*AK4&d*ILKFl6({>d-jaS^ld0JRc@s_nq$<$|yL_jH4hB`6{Dno(6neJjnT$@+u2q)&;9Dt*TTh7G@nZe~vt{3v6=WcROo^pFTX +zulA$j{azS{Ho@rM4-zRXo|?q<7j}tH*D%K0yCy5)3S#R-PeWCh@&2EqY}zuS_elYV +zE)vZBJtL~21m7r{G(CrhuQgBTFeMk+BVrXZRI1A4?ZyA2`llNk8^B%nCeb*w= +z-z$4MZI%!BeY_mgm!$ELpT3!F;eWzuYicBn$W0`FxxE!T$lM5W@sF#x$6iR(97DKY +zl=iy-LpzS}zAUu=nD0u%b6H!FC%l;)h0(SZX4*=@77)n7JmGXyoplb%0vb9jyWZ<0 +z^%M@N!w;&(NI4=TX22NV<6&PvDMgmjWao`V(uu+qrnu=v8&sGeO{fa~cCIkS!{^WLlChg7GNk4p3Ip3elF*&g#mvgV6W1^I9{*mTkJh1K{ +zvV@SlDz5bVC;QUuX@P!lgScmyHT?bg-8f-R5{c9pr>5Ddpth4pO*q5IqW+!VM9rGZ +zk%^DWjU6D0zO8LYWdgEINJ8JXrw<37>p-x?Cl0@O2ib;4IuRv%{yX2j3O9cK?XsJ* +z&N>UvKKrb*+yA0<1n4C;h*R +zfOHx=_Vp6z=~8J|JS547XgPQFJ$PhLsI#;VGsZyyJ3ZLCcO_8KmW3wT6>VzJ$UD=PF#KK +z2hiNwj<0mgIX=Q)lDu|tX-k%#gC +zz|1dLS%MQTJ{dkM8HnfLp}*`vv?q+^?>HHKB_(L>>Af9)`Nz+I9b8PA{zhX$0N`I9 +z-4#uwbL9*G+~Jq&wCByLmbkwxX5p&(V#I%R{b8hS;pe*{E9LrO9C-mo=T77_F0(Xn +zdf6WMGD$30QGtca$|Z3q--A!Hgr1MUlQ#jF-enTd7QO`ym;S2=12^RE3Ma6$V_2Gv +zhza0fC*TMUJ>4d+x#>rudl1nh9WeZ*ID7cdcpA+ZtL^KbZvYmrIv)=Qe}uYfT}nf_ +z$;j}U>LQ2V@r2qo5yp%H91AF8YJMJu>DczBp<642k4$hB5Ab_f|Vi3i9F}NX)YGg +zJh}hj0~qES5W5+PlM;RGtme0vRm>xXI7qa82u41VV4GCMOu|R^oL86%1~7%QJBv&P +z2B-uH@*xfz`#c!e60kZMd73)mIob#DLYt~x{G#($V#>TmVF8@P)bh*$^z3WJoRb%# +zdd))Y?ioVriSL&qdXz5K>j(h8{@AX!r*q~yyTK=CPjT5LcWy~r{oG_h47w>>c6H;~ +z&F#|JHxYi@X&AfptM}W$!ASLZGBLfguN6M +zH^+2dYaRy}yrivCHH%Sy`412bm5UZ@9g1Nu_Zo!l1XNLgrf1qzc!^h(8Hr(J&k>}3 +zCAcE-7)|hf_-)boUU~xXtB+5?y2_s-UA0QIKi9?oinRZRBYo2I&siPV_V$lQ`$cH& +zTc(X!;;Xr91MGFc#;6yNEgT0#UXsJlq5UpxZ{#c!KzFeK+Z=!-44HkM7E@qU$RJZv +zizU}zi!;wyB)tncPyc9J7|jI0;gOVtT`Q|f@b)(^z;v1`P20MOE%ac-k9<0|=>h`x +z#Acnry&~y;*PF_VpS4!^DH!&-S($*c4kK-QAvaYWLrjGlPGUV-CI*Vy5=VH!ji!DC^DTL<_p>J<1N^2^x?2=P(kQiuxPy6-Q_%&`C@;74v +zuQ&kQ@|WGalj+H>S=C;gqxMh^lKMG@8}$Li5;#Iv&R);MAa0 +zunyjfe}Kk@=`>%nIMf$GQ}3wLSb|@K`{QUL2EeqFO#rTX8zlfpq)nWh-H)r1>v5=p +z=v;ud8z4q9!^HI$RiSz5H_%*i5rSGmtsXO)#I29-lZ->tKN(7W6^%6xagRKAblL#Z?OSo2rCA_1zCDV +zeP?(Oh((=rY11TAZt7C3zW#kUWqE^K3u(EP%3*LgA$HArk(hqY0I^ +z%-bt&2x7IW_wH$h);}Wt069c1eXcAeGvHKstzHQ&&mKVkp-%aH>3J)WY^=fIo`F5t +zhd;}$#9to(@Qw95=cTe*GpF^&EC6610H=iVTI-zl%jJ~MZts+`-x9j0%jVUguQ!50 +z5+p6)AD{GMf)^C8~Sg=psh +zLb*7uP5%#;Rhp=s160o~Mdit7plk8<=r280gr9FeuUvfh_Ey}tt3%S7ZM$F147Wp1 +zQ!TuCc0@^Q4)$^;63o$I7||&7cmjrMRpGkA{JQ{6mw@EodxIf($)5CvN}$o-2+*^i +zUx(;BB~V!_ZUAs?#-jGeIvuUoBH+4AW=Zt1wY*_F0O>t4$B<3JAiH17q$Cws0Ib*x +zZ$%FDRd2>wS6_q^=T`|ElrFwjb5*;XnDNX{LesLV2VMIIFhJL!k655xfjQog-hA}q +z86Gc=ko}(G^x=RPIF2Wu=R_6VwbHufO{*oGwEDy01MMI^$)wbm@dUm(U>$>?5`P&@{kAL|H3rPp6*AQG;ydbh#h2GKm6+#$Q1Bk?FBPY!=?Z`4lS+kEWzcm{)U?G +zM^F0}PFQpTLLMDkTL;m_%|I<506T@UDIEtlwj#qT{IKoEooNURBJDk>B9=0@ERDrg +zQ7l|B6Add?L91H`(;I-_NT`-qG@0Y{{hQbAMt>w}ElyEH`}wt3bvMQ!cjIY-(ba}r +zDo&G_E6ROR;ZPAYi5cm%P0}WIU6RFU*zC#D`HsX*L^7I~NGdtGcQMGo6w6e1YSzc=J#e$RZ!H +zfUJS`bXtY+{Ksbk{JW)PC8*>Thl^MM-@hZo0JvwP;|#Q8g)*riYgKq(Xo8kZseW(P +z;1J;KQx{^^Necwrx(FoN$P8d+=@0s`{E}1AM#tIF-FYjX{K}W`dH{fbd30Agk<108 +z%-0hB7>5E$pg0*Qmdr@qKlk@5CzR&}Kw^N*A`qR8ff?a(`#ks+Zc9f+yrI+jgOVnKZZjg=Wxm5^ObkJ13= +z6PQ-4n!6MEr2ZgFY$%-YV;~knZ`6nGVSacp5b#GB$5D^a(R5?g8;)&BVFUE^f;VIDHbpueYbx@`<@yMV18++004OS={H?8Z(Aer +z!khs6YaDUlH5|7bQefcv3i|=3%x}b!x2zFx>)P3j)=h`tBjL}cGFZx$gR|;!uyY`s +zUH6$LA82pllr_vmvj_g%_efU8T;+B%Gm +z_EC7n7WKf`{enpa1c|(p}tYv^P|TR4QFuDSu?O?RlOAR +z}+>Or1U-C)Af<{ef?`H@Ep>>i^iG9{lv_CZ}J&X;W=kUz!9iG7KEtja+jR(aR*Ap${j` +zN#g9qBUm;qLBh`6kLXxrWgx5NA@?h^9EGMOtR7Fkv#|8%=iYjx-P5`ciL4K?j2B%5 +z2)!eI0tGMnN64OydN306B568FuBss>;8anLIelKLaKDrx%!01-n=XRhI2)&)SdXJ8Y6VCIF#oY4(u!N +zsm{gjmSrsTrF8w4SCk1x6q*4VM(F-G4XY|r&AlTY%(D8!@a}De(<;guTn$=MS%woX +zJ_VtwQgm)R;s5~W3e=MD&$)0lc6D&1>6w$T?=H>^eA!vRD+T~JKf3Fe$&CIXPW<5& +zeZr*KM+W??IAcMJ6D~SGALML^4xM=`kUQmLy(O?hsU5|%i~im?_a^u%r{km<6?mE$Ks0Fq +zfR&(Q(Dw(A454pNzj%JRT5-jq23&L5ih>qkcF#Cz@fGls_Sdj(UpId7{1Mf>!ls8Z +zBmK%QKD-acf!zcmQ4)I}*3M7jZ7W7_!c<}#9yd&8 +zsdwiIYVd*;SucSdF@qQ|H0nXuAQw*2gFs?5!Jl)VLIn(LNO)j6bo^x>#3;1tX`mZM +zY|6xfc{MoqjJe_j)N^X>0L^MM&TBC2c=9Mxv8({{p;%ISNJwjT|JY1`FZ*1&=H=k; +zCsaN@R7j9JG@Ecl86 +zz?atTwCI0IR`cm0q2_-7Yyv2UU|K+-wlauCGiyYnB?v4I?CT{UV4?AofIJ7IoBbg{ +z0ssS_zN!wFzpavfdu%d@W+ju{_n#ZFe`^mGEU(6yZ(HmLQC|3!GteYWx?$#Lktu1w +zvc@v(?ifZ~d=sYAe3KbKtS^R+O`VcpQdSbcr`~@mrqz{6jl0t<(#xHFeL@l2M&h_{ +zX9u1-+~;JHnJ&7Ijux1Ew;~np;Z+5&dR7jXtscRu*-80cI;W}`9YJzh%0; +zdCp72dPiv@nXc@EkPg6P0MPN6@=R=j+kNv2>N#cwe)NU?#1edH@6*sjW<(_JK`d)W +z5LJZ50fv`jMsW%8%5&gbx(4Ohj4aE2$|zBim1;bKRr5`(&lss((0+uHG0DM4`A7 +z5GMrj`wM4O%ewb`VEuhjG#?(K8$?tp5r@9*VNwtYspl^XYWUI3)6p=+XSE7Hc5v68 +z-u7YKecNM5r*)ij@nXzb(m)C~XPE$AYx>f}EuDh(_17axx?x6T09`|LY#CR9jEiHU5WtF+{%!S}m@*X^Ck4(Gg(J +z7GzqRBqMHijfTrlj^OMi37RVgnHIKvZX1vJtiD1G59hP7LBVu?#d?uv1|AP*H4;k+ +zmB3$822Y>_IbvHZLuoxnj3q;wHz&to7+xe&q#+|3x(Dh05Eu-O&|?(n9Wsz2rjWII +zE!bdZKZ+Re@drB%%c_C%-;Ksfx*zO-qir_MuEOl44X9}-bJi)`y8a0I$V4oqxzmzN +zqnmB+j9Se{cE}*W{r|0uJJ$HMUJ`WDv_olLd?KH*$@gb@eI*)*J;q3|hiGnwNf0?x +zb52ifC0m+Jry +zH4o8bN=aY05DDw_x^gM}iHJb17lBSQ(ge}2gz(+_Tx{Qnebv-3_W$3K6x-pZsK +zf8T5hJooT!tpCFvG|Vi;g_o~Ffb4PBs&+)c$Yn8S5!qWauf+p<2T&dK%2L-^S2IpK +z62J*NZJWEWu(A}NyY@73MzKi~qe&N`33GTLitU|YG!I5F9M7o5Jz?b%uo=USv%~vg +zkk(J9qoQ>#IVpvUSI1COsuSpFFxvOZ{clke+@QZMg77Ue?prWz{ +z6;;)!s8-K`V2R`n@Tx=!vXO@(5e$utkZCYNCR+rlGz*MQ>{hd?C)qphLn7%zIOany +z0YldSFhIaCJW4il%tS)Br?mI;%pep*I*V+hUq0ii3+goU(1POv#MlG +z$hHFmqAhuO@xF8hM@g%Dn7&BpSNZnlRF)t?e+|=p%F_8a65vhe3_p6WX*7Xk&Tztd +z^QucRn;v|xnHl609_{O@<^R_di`xGCKO#*gTEN=?V^%GUx+-YI{JclHBnmKIlz~l} +ziux+7y5dbZ@@x}&5BCW5x9^&tj&b?hR-!4KKwrz=>#_CrU*TnD0j~%E{PP3bk0#Q& +z`E38Qm!BIwus{rsBr!mmk{vPJTb&bZ*xSz+J|0cu;Ql`G19&_E75W=)qYFdYiL}vY +zKTwa$E~p?ndi-2)&J^SA{{D_9(Y$XEr<^wjC!Mnx*|aWpKhy9`GKSS>U518pKZ%e1 +z@)_|<@C3J;ak{(lW=La3jtt?_6B|)8qgFzNynY}j_jJ-^;-(%s%g%R}@s|CN@b`BE +zyEh}*+a{O(^!dQmXU4F2T9yEZjw9!i`~mxk;dj>TE5HC9WO?qvJ36UU%lX3Yc6fmg14Jxyb=66{ww6|W) +z4f=3GSrC<^9qsmLw$FtZ=FlYi0TJX~BQdo}PAlhzAx!J5%jB&rfm)ib1-D!GTaMq( +zXcB$Nyctke8pP6uih=^5@q~t*tK6k}_wVjUD$;^r`3lAGyjFO~b9^T$n=+w_60Cgp +zTD0wKL+_D3l~riBkEiooan2I-(>b)ZciwMo{PJaZnf(BNa{&12!_SvRvw>JVk-;dp +zaV7!bnrkkh&B!AsLc`f!($>q6x;}JvjG&`6OxmC6f0XF|BQz)CbmpW1%Dni&m#3k= +z)+a*xVk1E8qJu8(JwJRx97J!s@>DcTuT^~pOjU0D*1!J_8t1OWQ-^wS^B=b(no`=E +zg~_f?%+k#*Gn1G-d8Ygh?(f@0S|)*p3P0Za +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 +zQ+k;-9x~ +z&A`9?b3SRA==B{G{gyq=in9mXu;X_p@W{y~R4-j7XzX{s^S}7J_x}T?Oc^-WH9`O} +zhVwh0L4Vs>0uGy4;ASN}I653cU%MAG+~NvRWZE;ab(sx!uQg#wr964o7f8l(Hug>CBzJJ +zxmhc%on~SkexBZ(w8BM=KhO5FS>+lEdZBN87Q-Setc-0hNXL?rOz}8X7=Xu>bxwHE +zb+jFp(P=S4J?0-lc=i%Z88tBHEfu{F;%iP?7y#5pss!9}6{zfY(59b5o@=mlZ5f(+ +zM=<%qXY1)KW)Ro@e-R6~p#bnNzd!O#((?a4C#L?$#XlVOE6(TczcG2TYfO&I3hLh{ +zQ-3kzk6pb+x=AgE5F5Qn7s4ju#vgxQ4*u?~neh0oLj9{9UXnI>tTgcQ?@!<>zdMBd +z(qa+H+P8NfYSwHK9@nW^FHS!HTXdg03X9z-1lmNxKRq5nTZ<1U>i_uS}P0zmH-hDgwp3<5_A59{U0+Tc4;4CQ(Xc8czJ&1;|18Zo)|>nasa>! +zRxW-Kp_UXV&RyS3)_mOlf$zcQOv9W%gpnyXIw$=YnG506tIy%W?&n}8VKSNIs=@Bg +z09reyVI-aOfp@RPhd;ClZ`@Xk=-e3Ej~&23SEoGkT1(wecIqVwGbg>o6k#_&>vC(* +zMFUhVZ&00l%4ZERdB1G)=N6Wrw5AT(`2|UuUuX9x3%&MSZAKFJ2S}3Acp1;0sPaZ*}p#~_eL)ag{qT&qHml6XA$8`Eb +zPCDZJl~Y}l@Y23*-6Nvm2iJ8-p;?5-j*|VK19SN%zBBP_E3R)MpeKLOcz#eEpm<_mArUW(W*85h#z- +zE$ISJk^R=yHHB~>0+Z58S+x8XU8W?m|Mx(050da(L_NiWUoA#enN?`nl$#`%Z)6sf +zBQ2`{Q$ro_d#2@P8M-YN4I@3L1l#`ZyQB#m7?_+BjX?XS{b)LM3`d`SRJ66Si1JJc +z=g!Pxj6U;*O)K!Vuf7epy{TUAd++vRW^52WXAWa(xL-J_lmkh);d=TnC24`wVLtV- +zK{+Rb?lp*2!8U(Jb}lOF8<9sKz?pnPcr~G(FZfb|(5C``8*3)8<{umz!Vher28TSL|)N#fX_UAJZ*f+Kjrm@tfJbFXTg(zO%Ki>oZ&z=hivGAj*ZL; +zATTKnKV|waJXGSsL@yEm_$D~v6n2{dKmSH4vNB8yWB^J+<7ehqV9Azul7JTzh2KYi +zdq^{f6F@*@0Mhe2Kl})M1{ZoprZ7mt+}SsXSAX>Yyi?=E4D1Mysd4lW&j+yKzyISN +zeD3pahS6aGxb|Fe63tBvq5JF+I=5bu%Xs%2Nw4*jnSe|IL@I4UR^PlR0d#_$SV~`#J&FfJi6&3BS9LnV?h@YQMwJk^tu_mRvAIg4y4P +zvn?&?8yXamgH+$NTB2z0Psh`HOTla1R8S4W#yiLyup-$5%m7eLTC~h*lar8?Ou=Ti +z7t_J8@b>c(OC!NwmYD`CnE*3`lW5)5gs6XrKzb$vELLKKLv9$jep+cP!*dYBL&rp0G;{S<80^_fdo)GJlRW?N%R%oEGcrk0*cVl3 +zFX{aNyw38;EOF7_v17*`i=BGli%84`xNa73!vNs_Ja%xg#}{hla$imY@+f@(Cr@=D +zP?j%Rb{kX&U{taBqYC{O0HBQeZrLqHOmS8~RiRbX|ED>P$~4%-jTfdfGY_?E-h_(A +zTf{Z;O!wo$zNauT&>C+Ku6&lM;ktK!6Fyrx0l*}N$xPYv)Z=J9v=hz@7yP~`4(=br +z;zgDC~vib^*>ObSC|3}45h>nIFG={ +zeFYC)!cbE`{q7{9zII|5TVbqQffeQHC?JN)yJ03VPISMyM=lTN0w}%?#=a>MJ7pcH +z05C|VdBg*A)on1O7s-ym%Q^qljn=t|%ppf@C5$$!*uS0uFmPpL*pOeIji%;{yQcSi +z{bNYf{x=^0eBhD2Tgm=EAew!6Wctt3cHM_s5Gc)KFONv_k*U6-_1Oo&T9qGjwH^=t +zXx*a$KtqKM-~4XetML2ZeHyu?IkalMO6qQ0Q1}9R +zrbf|w?ii*9dW31A#NL#T=7TSz!yOCizgA{mj#0j1SBXzl9h8hYuATomL*+y`*oX21;t +zfcHJT`#phRcnMZV8V>EBz}Xzn*@pVxZUZ$*&>lJA9sIWaSs4tbQ4?a`WXDXY=TNG80hDhE$qzIqW`0p`q94kf^hOigChh0U5J_NaNYhcY}wR^iK#hs +z5Y6Yd^`hcXt(IcSKkk8HE}+fzlTRi_0B{;H&oIp88(_?@m5YKFvi&s)WI&oxi +zMr>`Z>_KH=S8V@z01zYqXx}Rs0JrDdx;zbE{zSg!8P%>UeJ7`+294X^gDkQWw!X&Kbw|8)W5nOg;g~o*I$b1ggQa^ +zkpv722=tX$!Ghn>`wfzT0}7kaeLmIi803k*oFsJe!UZx3dgp})MLV>h3BP%{0#jZI +zwz399SKfw-bTcxt9Jok=8lr2EW;S6}UWRDik=(qKH>2Vc5H4b~5f`_g!gSv_Od0_6 +z&=E!8Tz?nR7BymW!Y$4_q0=zmY&KiRJaW0Oc8?9h-j9x4Kx}RZ=91+w7S@Z`;)kLk +zdLjUDV;a)_(!@AiWCEm>7t(r;Ci(#sg13kOpl5gttxtYp8@)P+MBz_0lS$LE<}R)u1s{;td{?K@IRA-uAn&)4p{NkYka0NQcuelI24Sm3wyAxZu9gPbhX +z-rIvS7n=zTMiJz=xXu)?+oJf>t}PpZn}t(OyZ+iTB4H&)U~mWHW}adKusLZM +z8$@Kb2d2DIn9EiQO|CERmUREo4wC_3d<@d$6r2^s$XZ+>d^zg+R9OJutBUGejLgiU +z>G6NPgXEnLSTzH#+YfNV0N}3scN`%A*fgi>|L+Mz5StCaa;RBci0Gd<(rstGm4wk*K!=~Cw34cm=?Y9 +ztri2idVP3omlH9A2Se>MSZ%wAslge1?CYPxKYi_6w9Bal6KjN0paneE*^J?~^9Xw8 +z;yaVZ-wpU8#9Nm`!l^p*AHa9HFi +zQL2;uO2W?@ciidNcL9Uvdqp`f3DLVBGYM1V4@@Dcs{@Iv^`4B)w1C +z-Y__F57HlH`_>vv~xPZuJNA21-lUaBhQ9C>4Yk&P_L^wEyw&Od{+k9BG +z0^_PKEu +zw*$kM&IofLQHbN(Gj%S2PD7}|tY0vSfY_Z*6jUuD>R$(|-J!FqC7srmbgv^xFjIK= +z)pOCCHwnxj>Ai)_fQ0WY^gEXU1Yrt9Fg7`XGtEsn-`auzn_UVEU`OD{lpT+4FB6q^ +zu3O)MwQC!QF)jr53*3FW*MT`d&OLif^xhZUj}icYTc}%MS$j94*;%@41Gy~ON9)BK +zk;gM8++%q`8b-$vo$ZD(%LQB28rck*2lDDug*lK36zd-(GnZC)MjA>sFN4~oMr(Q^ +z+&mKU3o{TTW^(wspMMfVdv_sD{jWPA=!OBn*8h2-p8%jt?*!xyC+v_hH4_Ez9hENt +zp)o0PY1adJ)mF3&IJwWmy{j{gZkCh$5@73d?W*dlCCrDfQ(yGv=oH +z$P{=E0|OF;NLwWeO{RsKSy+sc+9gP5$DhGCpX#Ti^1AH4 +zc|r(WRxtH!BIWNaR3#GU$O{6b5z^0DJ;R_4J)S_ +z&)JYcUCB5d8AEh#5C)eK&e{!#M^)6z6JML+At#cN;77W9WmA^eaLMMSFxli7r`mT= +zW;k4OZa`+X4QF>faj&oK#piJ|1Hh*Ld`=P_f0ZmiAKCh`upE0gc8|cwgAkd#-N%of#9C!9ojyo40b8Aug<$o%Z7Q54?h*VL!g~@PFZ*AOAP{+@$XAsS6ka +zjeJw%7-~5U_fRh}i@0Wzl7v0gYf{oa6U+hn<5cCMMGeR=ucq^~LG!dKK<7~9uej&jINfvx=UOg`{sO`t=ITpR49_1d#@QYlvR2=L^>=K8 +zDHgsW+-rB8v_EV8voD@Sz~h(ubP6AY31Rm|#6lCI;EV^EIu~t(t!ybm1o#mi^1>m& +zkUUgXl1nu;HmAWgzc(~0(!vcHfU9<$mfF3bAAoyEOim**G$QuP=1J-1Mp)CG+FDUf +z046I#Gk&DGteEOJc>l!7U;RS)X|*uux+(*27yzvO$}o+MMZFvgsa_acC%h +zd9P+UAQJMS`}{uiG#x<5Kc~wNkT*w~4X5^9!t;+FM?qN*9zOCa^2=(G;B3`t>kuv6 +z(YEts3bZ2<3?z<;QE0NhU%wQS65lt>e@#-fKnB_Tr41|K%Fb0+n@-SmW=Vp!)qn14 +z1R6;~tz=_LQ6vj>+`F&)y~{ES^_=vSSV}TK-S^_7T#!@tvU;=QnlEEn-g7kV|)w98|zxdn_#8Is{}KuUAUSBkYLXNPg$xV~cuxrf9cjz_*(h76ZU +zR260wRATw9?<0E5p}%V_4>lp-okqv0o#?-KL>4w(sxWIEt{Qyykv%wdY!L7M&^`Fl +zued9-AM=5R7zr(wNp2U`)+C|=nio6S_E%R?f?N|joo>^RIX~vlgXE8Q0DGG_K<`~)sTzF=0 +z9->7{(fHQ8QB~j+JsYpI8I>tQr+1Pm=?Tc8y;%I1!egf)1!n{Uh)I4pOIIPiajUqe +zDiFtSnNIUdYEc(~FsZu;$zybpS{Y(oPw +zEAr{RXo4Srhs_L4`YLsh9&bP_6Fv-@qb+Ae9l^X%V1ke*zn5tD%P-5d3eL=I6xB5%qp%nT)fFw6)71&6q!)CZ +zCWi7G^Vota)Yk+AaiNzkw{QLTlg>d>UxOs*`Lufy2ag}dxeFw;!GKsAUcU*ye!c|0 +zyp_nijX2SJFk-N^7s()Mn}1PH^mXai~RwFCeG +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 +zT>yl@51l)MGduRdQpn9Z_ +z02sWdrUVnTYqUMFEf}B!7TUPMZS~?@Y`(P`FMMx1CI+Sj8`KVj)wC>T7TbpWADInaDR7W(#lRW7!iz`QC=wF!LOttFWUrJA;|+I +z6Ae*A(rySr(=t%Gd@J(G>f%@SMr@k4k{{1b45OczfSdj`sD0e&flWjO{)nAK=RWnd +zPm(F{UFc1L#NA2CB`{p&9pMjgn9&T+Og~QT+K0U)^yd#8!Pw9o)UMZQ=?2p9B}DO8 +zp>aba3M-1lw>5{}W%G67Pt-`gtm)0drk6eUvLnyJ8Jcm|eUe}!N%-|9z?Eo!{B_Yr +zjBNgIzhcHwPX)4F2GO8pp*#S6VUX;)G2zfpAI9_?L1y71d33iy-iIyCjtzHjgw<*h +z&s71{KtMTsPDO9OIEwzRsif}0y5r}hiIGuQa8g05CV>!GoWB5Yv-B{Akb9Si1Sm&=Q2MdDByTA1)p{jziDCKz}cx +zueDzUTKE&3K9E!3LgU6|Sh{IBY8q=`ciIKbWNn{lhAKj<0GFia_{u+=>|!=qKlLW|Svj~sA$#^+Uzku-T1UW(YlWHR_ +z=L0YsC5%o-@XG(WA_gqf_rKbwz4&VEuDl>wn^FM +zUqNPC)sk{CY$n0{$?X&kn=q4T_bRicRB!wx;qE_7sX5fmHOYD)qv`jzU{}WG2=dM7#LK>9xw2d +z%ImW;QT+R-Gw}CsCwiG%kLnd$X%TxcLW_UAzfF{B!Z6=KC33U5pIcP}%IeoDnRu_0 +zFCcj#Cogzf5Ih#VujMpm#s>v!k*mK9u#*7&`KN!vbALR74}bO_@agaW6teH;a^S>g +z=Mw*N%>LAC`?2ror*UTQL5vR02{V%!Jo``!%JZ>|DE{)z%Y{Ran`{VAzDPEb68Aap +z(yQcNruQ7D7v6i?F;jfI%_7>e&C~SB!g>|Ul8 +z4;26^2ml;uh)kY69ccR%rvd+U003|4tM8KxqoX|YX+8^(OQqx}0SS(0HjEG4lZMZJ +zC=F@36{ucy8*Gj&1bx#O?raitJH!J#bn*B26fVxi&PL_3&0=iW>k|@OfR^ePwn1+2 +zzr58~l3{}3IQ#_*kI9>%tJe}vwfNctWAJX3s*miWk?KZv8- +zci`xbSI~R07wntjPjF&cMz$Rd>z88LCJx`#!<8Y|4anL)+1rYFie7tJWaM$2-j*Qr +zRss=i9j0>RU6b}sq4}=}7<&JN{GNqO!~gzM3{B=GD9N)B!09!<-t(_?2I6cwVqpDe +zFW|MG{#>2|Xvv19dV?|pz#sJQdBf<_{&3rS6H-(oqZs}Op_yh80u_BC=drJ +zN16j2P3`#67k@(MH;@977k}x+H#^-lr!dPAhr$y)dTc9HlC-!(rs9yZe4~UhG5_npL +zmJekuhh%YzeTPZoE?-|uCR4TCp-B6ANoH_#`TD!3G1NaJ(|+Z&Bwbuz3-NJ;fPOE~ +z*(U@!Z*4tH4x1<{ieHC>r3wQ9N?_8BnWm1^!moab!+_NlLRLck+aC)J@8&E(z4!m- +z>j|je(pP-@2MC8hV;CQo%>Yqus&t6dGXQQ3;`X92*M!Hvn~(IYG?dn_M}B!7)GR#K +z4qo>J#(G;ZJ={aIEtt?hj$3=XvJ0_j^{ueGvT@yJz!hkJD*IP12@PRvunS{-9SDoo +z;&MMh?jro!lRNO+AHRS#n;P+*7ypcm+!6w`b{u)}H5`9=2T}Y3n3;+|jV|#tu)LCd +ztlG9#2z_Nkl_)>v5mylYrXI!5S3j^MHTYed +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 +zGvpBte8%P;8MzGy{x3v6?zNruhiipe(#z6 +zy)DeXCReUr#a^QSC&&#*CZ#g6F^E=#(XnzBHm~VG`|@VIesB_>`09S)BFOJX01#<{ +z-tmwOu<@cGu@vsSe--X}U^R}u+l%9e`f#;>T+n}>vcxn#-SZC8qZbj`_6YK{6 +zekIS00DDED*wGh>j#NWib{9fHMJ)H_EXQVLSepw7_z3|=YVZPPPQ4C&-G^a~^&!^( +zx8(m%@lxQ6HU`Ws*Bby32ySZ&g?Dz9awt`R$ +z893lz*st@VU4{`PWUnH2&`55=3h3lAsKH8`86<5W$ZfUFRgMyF@S;GHPrE?l}qMjz)A~uP+$9y2+%qEtgH!(wBHC>eBIDQ96$)W4e11u +zC!eRAv=UW2J}#Cg=i#AN=32TH*aiXGc5}-krVjr?bP^hC9z^QGUc@F}Apaj+IqPizT2KX`Bi9=MI9fMVS^edoDoXhAVk{sQ +zSFx-mhJW{DH?aYWE}SM;u3;chU2H&=6LB>cLvR3r!9uqe#4z|LREc0!6O76x1gcxe +zO^C<|#O(X=`g28R!mz?ByjBPY3x08 +z5LbtWh0E7mUyrq9`PVF8fu@Ff1j+R?Dm47o|9ueu`&XAxNj^Pi4tNbmUJ*!N^+6~V +zHF6RwWC<|uQqK$pv5$}5YYufGb#X8B#!aZ%e4psy5M6?q!_M{yWR#hF_~{dS$daER +zC4LlIqyg0p6>t>a`HpUPK>Uvk)69h#!I1L;?fGzqvX-7vcicwy@Ep_wV|ZlyH5JQqeMruJGKZUEI-T&s%w0(-A6WU6sUI_ +zohTSJ;P-v$oXhE9ugkW_xgrEiID^Bs@+@8rH->!{#3<_YGVu>!2aHjWyj^T=OnPHU +zKyO%4Uy9`eG-A<9Rv$5V7noszg_oO4L^~e_MRqevmkvhv67S2Gki{ogYZFF>AuC;? +zRn--knKZ%_IO5IBQfh-?3Ze1ZO5ykXh%N7^8h_b&OCh6eoSel26K|~g;ARy4et^7QCMN#*VE6H3xW)S5uXo|nCBN$vBDTej@)0#X)`` +z#n$fz`^ggI`Rc|#UK5J_5Z +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�mNbhf|L- +z=s-b>*<25f-={O#~|p0^Z~Ai1`@Spf2bPsUt|r_0f*6R1FBt)oWc +z1t$vSlm3wV`ypua1#TDvH7Nvj7G-tZ@?{hdAN6LC;N2r<9K2(^ieDRI(Zp$TS^33- +zoZDS$W7AYt{njSgA76T9_Xe}=aST0b;kkX`{K|Q5V5filQSPpR{yVClJ!4G#x!*=-exHu(GaC|+Y!tL6nczy@*IfPi7i>8$|CEjf>T%3GzU5tE+=6n$B; +zv)4HqBu3yDw4i{1r2a%;>DV%m`#hMb>F(i+%AwpADK+{tU!lZEQ7?$6gbDMlP7t0? +zW2+B*w}O~v3WC}do+@3^vM4Gx&)pg1i96qKOR}E9X2>7<;O!q +ziSpBSPZc+J#mpPA!IU}yeVL8gPVU6ry(P`?aF}c;IbLPkGxFZ8hjYGL6^)2*)7Pvt +z7u!c2Jkimg%N_v^$tq2VHGW)QyOj5YVvGc*vPd>w9PfCWocZNw`qUt}%qy-)3YFd- +zmv+(wCp{mNR27x3$~9&9tL49a(EintVycCpWJuo3{sK98&j?b--v40vaG3c8S8 +zX7j5)??<@}eM7`JZ3^iz5wJ!*08C(z!I;!( +zk?4e5$%hCC7sLY`e?s?9y-)ZrqcL}XLhpwy%@xcww8ws?2>^ti$D;P6L1K3X2lH9s_&9`TAdg+zfQ{=JH4I7ERc(Y3V(B!x- +z=JT$=RL#aXN^!!nimh(Y^{>)xOF8sY3Z6eM_}IGEe;XMS!rmb_0H(e-s`V-gA3ua{ +zb3kXKc#-@5XDrmtade9<786h2xN>l^)r@>4Bah!^p4I2{UV%t@V#mFm;8WsEL_${* +zStYzlDWzz+Rr9IFtKvq%q{e@jMiFffU8Vu^q9h>nINY1M;;wNEgNuMMT?*XZ6dJ)-{$c@W2(^cHS|LkDUF>Ej#YbGKQEz7O^kF~zuHGs= +zss{OX9pCD_x1cQ%lnCGWwG#+8w*mO@4sx(dlDv!~lIQWN5^wdvnd-ydCZ_v}#m3B{ +zX=g&Y4FY%nzJH>^IDDWjipHn%NvbgxpwD>vWx788@maIep^@EdD-%^PUcS6dxg_^= +zSB*ml)e{*YIGXX5wy2fW)iWV3JU8gl$KZZgpcL>+!=?lN3!=`pJA#K}saK=~bc&7z +zBXScrMMsCvS#n0+f9*i#|IGiuHB?QV4vwfCTB +zcTjY1NV6>K8utxuXp(aK$(HdE1I!YI%&$evwFt}}rk&kgcZhtdr}~pLuy@&v+9*Yb +zd|gv;fc+KVcYfr#dY90M3J$?&9w%*P;sR($g#bbnLS&F7bd=SbyI0p6ra7AkE5Sh* +z-bb%oH453wg(O~*dMt)jr-^j)?u{|?*->FBP)2q9@@|ExN0^6i1^#Wu4oWqq#>39E +z17i(8eg706`~tud#wAL?2a!3b7IS&S=~thTt&kV59L4uOp0klE_FJ0a`IvnEQrb#9 +zJ#9<%N?3R-#SeG27A@WuFWx}Hn7R*ZQsfZlIsX7k#2wR}4jn$;{AAW*GcMexV6VXR +zc#=Il%o-^FEKMWKd|{PWb2Vd9KKH&goX=3zm}Z&fDwXE`+yrygcQwf{@pb-~B_R)I +z?hpV3yptj&Kw&cEJ*L+K(cYKqV{EAuoNTZ>J?Sv?8QJ`<{ue%a?{|OXajGmbVvp6h +z{mz=QBo*r9@81kGZkS;gD@8BHz-+$ha8S#&LBRZN{S)$`;i<`ya +zT!}Zj+sh!XP)gQ>TuEfIGsg*O#~d(4|1j*6{!W_`c)Lb?AH +z##`LtfNhUSseCUUl$pWu^#V +z4k6>Huu33A3N<@f(R*RF-b)7;J0qeBs#FFT22&2}OvzaHt9>P%@=Bxs0rL}bASh$! +zDsdvk6RR$<_?Ql0uD-YyxRqf+2?~VoVVg#O{~%9Iy6+|r9dW}(J7y3R#&UNK8jZ;M`hr>{Cgcl_Yx1lb?_R!OJrki{ysFYkX#VHX_!C&MX=4*#{) +z=@74;^b33ktFC{1R*yNxE4&v3;(>E;%c2@{GeJd74uUo=!HU21#$ea$oh;fylw(5p +z4!OrA5n=TY9ON^9wlp9I3N5>ni~ygR+m7;X#2B;r=m){Z>v9|wZfAZh>`bym>C?gJ +zpAD=)?8H-V)@T8RuxZh%l=Y_SMgjufx#QTVK6wE`D^EV(`ZzOeU2PFHSU9x5A?he$ +zgq$nx&tM86Akow+ZV(#+B9(N*7Hk@!vUhB}oLK5Xxg8K_=rg$)f3eTTy8D4IjH@%M +zDL%CrCe&do3?%rLz_|VPb>(N94!rnbC^Q^OA#PNfFzJw9P%QUw3F}m(ov=qtE8i8N}17v^{%>zj>I|zv=fh-(%!! +zyv70Dhywu?c&t=ZOrfeIJ}zWOf9i;bnEd3m${gthqU`SA$i +z0$kXmYO{l`7$WEC;LEn#CV7Ja!t7e5jhBKgM_yN&c};|Y}f$oQsz=UF+BHAcOBQSLds^!<(9 +zRJ`V{POB(><4|n4JjIxN#P+^cUo~@0jMcZO7$Y0k-G86q +zm-|MU%$f3C9y@8&iRVB$>b2^4x@lf2#hS}@?7VgR1D}Q1;M63Kt4}v|%TXIH<{T*l +zv>B;a{JS|HN=gbWc8$r=&!*;)rg~HB+7OrI +zRi=m +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 +z^9>zi=53(}ea`S*Hnu>z1ENuxRea7 +zA?)xwNYhEf0i%@`gbHQ~{M{AKQlD9)pZrwwpf;BY@mA)3#@>bg&b`+odYP~sR%H1B +zD!y_GYsyy-x^W2WAGy4>=1(f~E +zBfhZIlC2v?#3j%w|B$IFxP}#8Lq0mF`_q0ik7Z`g`vp915bF<`b0GAO)ha-q7~PsQ +zNQf88-!0y_;Z4EUS3_%TMuj;aEeiQo)ouY=+xRT&DEwp_oBOZ#AV41aNlk0=|&|b>GCa=ogJ&L9JR~Z+EXyQ#r>$+5kHi9C5oC^IH_jB^fqe#V>HX9JvH+_rNcADQw~H;R#6ldO)@~he|KWAb +z4#;5~zBO8edF$-lq%BW;D||o#0@}ce9EMM|CdNoNP1;VIP?H}|i%FI~%+K@K&~mG5 +z4L02U_7@frRsp0<9{IOgN@Ze3GSYt^7=&J_!?&J@Zz5JRP-s_o-{Ey?t`~>yEteDC +zF}H+JkD4w!VEp6yS~(YOp>zg+1>tn{jE|3oWWemnTXXjtU|e98lCX1bO>NYd;2Uo( +zLDMca6=9mkCp0IZ?6xD|LPNQ2juBV-pMk|@!U?_VIVhqt#}!;b`^TISL>>Q +zm9v+%*{aZZ?=X3}#uVB~nAWfZQ@M%@1(rPcyDq$A^sl3-?dp_sV|f--jH|$o+R^E| +zu1oj5;WwxB_5x( +z=geOV!$K@!0mg^EVQHEba{&UVSx#goY`pm8yB#dT=>c=6BpOeCJ^dZJlYn@*VCN_5 +zA+OMDyvXE-Zxv5p-*^WJNq(0YnIvyooBQ=s;6AjDYXe{I%aLrD-qzb~JIBC?(40RZ +z(oOIYSo +z$cHrrRgpCekX|!!s0mq(j25Tn+FZGd?jQH(}esxaprhx741cwd3xz +z>A($?cU&{zOS+(euIPrE{{kTs36D#yM~Nv_`~BqsPgyjm)lUV;{Q@rtQ +z6yTlA?pRQyX;Wc;ts1M8TZjLsLnxY6>tqaFT7Pf0@`)LiS_I-2R7@~)l|Q>N4Q$HlekN%fPA@8h0226k +zK0`QxAMqj&xw;A|*z{i;hyD(gu9hFJJzho>BfZ-!1SuK#1_*-PcHjSQjmh!Kbx&Ou +zm$(SByg|de>__KgZhQ+Dd*MVNNWRQcB$Hedp-c$6^tKyEebJW@hw(-JL#>l@e+3-P +z{Ok9tV$2jY^dw>S=TZ3zNK72 +z%kg~m-APjsBHBo#@Fn+_w-~j~6>W>_Tv!tPG_vw@;!597H|eXz$B_4lKSJ-1HD^vM +zYQt05zQJQ_u(Q@scQ?1m{C=2M!eax}T__L{LTJflMt#G! +zgZl38LNPMA(>Hs?&?jgaKp{G8RH$FXu$=P3-C^WgCvJN>szWhp9Zboy-@cRa-xkdp +zD~>Ehv7n<0X>`vON8|>L!did6B$K?C`1aBW_hG{ly&&gg*>sEF&`iw@hayAaxit?R +z*E?F4-E-$4vWFim+M$l$B?l+Ndy|4UETnH6f`p%mggX>1MTQ*tj418Zd@L!wXV_OW +zS(?ntmUhJyYhM)>ZQ?F-8lr;yM!bNrxc}%)$3t%3l8bsJ0~>;@zScBANpSa7RguV@ +z_ZK9|JTGSQ*;ljnV6*oC}Jaegr6l`w3cv +z+%S@5SZ04YGIA|smR88jTjh);a(;GPh6;sT5IqSv+zL8o(Rs+uIWE3$G%z(mCv>R4 +zFKEQ9e7)|U3PRrf*bSQWF?RD9Ug!8nQB#w`?AgW?^7oo2ZK6JnQ@=tFMd8=KzF!>% +zI5|2~U~jCSc@P=iTXr3TE!aooo(aE@A{=Y_Al{T2k=>ZbQSEB1$Ljd2hPaX_;GTkH +zC9Nn_KAjjdPEy$0Uii2uL=q|dd@!U;^h2mc)}&1AwAxj|_i4s-KT?h@($)XjxNOl$^9rd8ZgO@nyr$z-t*0(fp4 +zxdF%htMhZq@V2@B($Tqc6r}aaX&y`LSDk6oW6Rqq+c%DmNKv`B_#GCZ^bPv?*YZf% +z4P(Nj)ssG;lpnL{fN5p!Kc`$sr(W_WQD{)oFRc9< +zcfxDekTfNL8+OcNwKJjo20wH?j%0QAai@6={_z$3iba6L+}AinJfN>F6TxeLamWny +ze +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 literal 0 HcmV?d00001 From 2592cbf4f5ebed064eb9ac1ed81ae92495fbd387 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Fri, 19 Aug 2011 11:39:00 -0400 Subject: [PATCH 10/15] Bug 677531 - GLXtest process stays around as zombie until the data is used by GfxInfo - r=matt.woodrow This gave zombies staying around when using layers.acceleration.force-enabled or .disabled or safe-mode, for instance. --- widget/src/xpwidgets/nsBaseWidget.cpp | 28 +++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/widget/src/xpwidgets/nsBaseWidget.cpp b/widget/src/xpwidgets/nsBaseWidget.cpp index 475232454489..b5227b9d5630 100644 --- a/widget/src/xpwidgets/nsBaseWidget.cpp +++ b/widget/src/xpwidgets/nsBaseWidget.cpp @@ -828,21 +828,29 @@ nsBaseWidget::GetShouldAccelerate() if (xr) xr->GetInSafeMode(&safeMode); + bool whitelisted = false; + + // bug 655578: on X11 at least, we must always call GetFeatureStatus (even if we don't need that information) + // as that's what causes GfxInfo initialization which kills the zombie 'glxtest' process. + nsCOMPtr gfxInfo = do_GetService("@mozilla.org/gfx/info;1"); + if (gfxInfo) { + PRInt32 status; + if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_OPENGL_LAYERS, &status))) { + if (status == nsIGfxInfo::FEATURE_NO_INFO) { + whitelisted = true; + } + } + } + if (disableAcceleration || safeMode) return PR_FALSE; if (forceAcceleration) return PR_TRUE; - - nsCOMPtr gfxInfo = do_GetService("@mozilla.org/gfx/info;1"); - if (gfxInfo) { - PRInt32 status; - if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_OPENGL_LAYERS, &status))) { - if (status != nsIGfxInfo::FEATURE_NO_INFO) { - NS_WARNING("OpenGL-accelerated layers are not supported on this system."); - return PR_FALSE; - } - } + + if (!whitelisted) { + NS_WARNING("OpenGL-accelerated layers are not supported on this system."); + return PR_FALSE; } if (accelerateByDefault) From dedfc2d8bd648de7fdb21d2917324a11e98ed0ed Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Fri, 19 Aug 2011 11:39:00 -0400 Subject: [PATCH 11/15] Bug 679864 - [4/4] Upgrade WebGL conformance test suite to r15318 - r=trust.me This is just removing some old cruft, mainly old patches that are not needed anymore. --- .../test/webgl/delete-quickCheckAPI.patch | 19 ---------- .../test/webgl/disable-gl-min-textures.patch | 24 ------------ .../test/webgl/increase-timeout-delays.patch | 38 ------------------- 3 files changed, 81 deletions(-) delete mode 100644 content/canvas/test/webgl/delete-quickCheckAPI.patch delete mode 100644 content/canvas/test/webgl/disable-gl-min-textures.patch delete mode 100644 content/canvas/test/webgl/increase-timeout-delays.patch diff --git a/content/canvas/test/webgl/delete-quickCheckAPI.patch b/content/canvas/test/webgl/delete-quickCheckAPI.patch deleted file mode 100644 index 11391ed25776..000000000000 --- a/content/canvas/test/webgl/delete-quickCheckAPI.patch +++ /dev/null @@ -1,19 +0,0 @@ -# HG changeset patch -# Parent 0d4172be40b03cc4dbe704244623174363cec0bf -diff --git a/content/canvas/test/webgl/conformance/more/00_test_list.txt b/content/canvas/test/webgl/conformance/more/00_test_list.txt ---- a/content/canvas/test/webgl/conformance/more/00_test_list.txt -+++ b/content/canvas/test/webgl/conformance/more/00_test_list.txt -@@ -1,12 +1,12 @@ - conformance/constants.html - conformance/getContext.html - conformance/methods.html --conformance/quickCheckAPI.html -+#conformance/quickCheckAPI.html - conformance/webGLArrays.html - functions/bindBuffer.html - functions/bindBufferBadArgs.html - functions/bindFramebufferLeaveNonZero.html - functions/bufferData.html - functions/bufferDataBadArgs.html - functions/bufferSubData.html - functions/bufferSubDataBadArgs.html diff --git a/content/canvas/test/webgl/disable-gl-min-textures.patch b/content/canvas/test/webgl/disable-gl-min-textures.patch deleted file mode 100644 index 1246c579ef37..000000000000 --- a/content/canvas/test/webgl/disable-gl-min-textures.patch +++ /dev/null @@ -1,24 +0,0 @@ -# HG changeset patch -# Parent 59a9fa08e7308ecc5942f76387340dd209bcc644 -diff --git a/content/canvas/test/webgl/conformance/00_test_list.txt b/content/canvas/test/webgl/conformance/00_test_list.txt ---- a/content/canvas/test/webgl/conformance/00_test_list.txt -+++ b/content/canvas/test/webgl/conformance/00_test_list.txt -@@ -25,17 +25,17 @@ gl-enable-enum-test.html - gl-enable-vertex-attrib.html - gl-enum-tests.html - gl-get-active-attribute.html - gl-get-active-uniform.html - gl-get-calls.html - gl-getshadersource.html - gl-getstring.html - gl-min-attribs.html --gl-min-textures.html -+# gl-min-textures.html - gl-min-uniforms.html - gl-object-get-calls.html - gl-pixelstorei.html - gl-scissor-test.html - gl-shader-test.html - gl-teximage.html - gl-uniform-arrays.html - gl-uniform-bool.html diff --git a/content/canvas/test/webgl/increase-timeout-delays.patch b/content/canvas/test/webgl/increase-timeout-delays.patch deleted file mode 100644 index 7584c7751a30..000000000000 --- a/content/canvas/test/webgl/increase-timeout-delays.patch +++ /dev/null @@ -1,38 +0,0 @@ -# HG changeset patch -# Parent cabbf6f041cd51f04c31b5f4467a49ecea0f052a -diff --git a/content/canvas/test/webgl/test_webgl_conformance_test_suite.html b/content/canvas/test/webgl/test_webgl_conformance_test_suite.html ---- a/content/canvas/test/webgl/test_webgl_conformance_test_suite.html -+++ b/content/canvas/test/webgl/test_webgl_conformance_test_suite.html -@@ -270,30 +270,30 @@ function start() { - if (ctx) { - var iframe = document.getElementById("testframe"); - var testHarness = new WebGLTestHarnessModule.TestHarness( - iframe, - '00_test_list.txt', - function(type, msg, success) { - return reporter.reportFunc(type, msg, success); - }); -- testHarness.setTimeoutDelay(10000); // and make it much higher when running under valgrind. -+ testHarness.setTimeoutDelay(20000); // and make it much higher when running under valgrind. - window.webglTestHarness = testHarness; - testHarness.runTests(); - } else { - var errmsg = "Can't create a WebGL context"; - reporter.fullResultsNode.textContent = errmsg; - ok(false, errmsg); - dump("WebGL mochitest failed: " + errmsg + "\n"); - reporter.finishedTestSuite(); - } - }; - - SimpleTest.waitForExplicitFinish(); -- SimpleTest.requestLongerTimeout(2); -+ SimpleTest.requestLongerTimeout(3); - - var kIsWindows = false; - var kIsMac = false; - var kIsLinux = false; - if (navigator.platform.indexOf("Win") == 0) - kIsWindows = true; - else if (navigator.platform.indexOf("Linux") == 0) - kIsLinux = true; From 58719794065018bce06c22f50a5533a71e13d620 Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Fri, 19 Aug 2011 13:16:24 -0400 Subject: [PATCH 12/15] Back out Bug 659311 which made it to m-c prematurely. --- Makefile.in | 15 +++++++++++++++ client.mk | 7 ++++--- config/rules.mk | 3 --- js/src/config/rules.mk | 3 --- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Makefile.in b/Makefile.in index 07ba7452b048..81efdde551ff 100644 --- a/Makefile.in +++ b/Makefile.in @@ -203,6 +203,21 @@ codesighs: # defined in package-name.mk export MOZ_SOURCE_STAMP +#XXX: this is a hack, since we don't want to clobber for MSVC +# PGO support, but we can't do this test in client.mk +ifneq ($(OS_ARCH)_$(GNU_CC), WINNT_) +# No point in clobbering if PGO has been explicitly disabled. +ifndef NO_PROFILE_GUIDED_OPTIMIZE +maybe_clobber_profiledbuild: clean +else +maybe_clobber_profiledbuild: +endif +else +maybe_clobber_profiledbuild: +endif + +.PHONY: maybe_clobber_profiledbuild + # Look for R_386_PC32 relocations in shared libs, these # break x86_64 builds and SELinux users. ifeq ($(OS_TARGET)_$(TARGET_XPCOM_ABI),Linux_x86-gcc3) diff --git a/client.mk b/client.mk index 0e22371c63b5..ad6f4b09a1e5 100644 --- a/client.mk +++ b/client.mk @@ -212,6 +212,7 @@ profiledbuild:: $(MAKE) -f $(TOPSRCDIR)/client.mk realbuild MOZ_PROFILE_GENERATE=1 $(MAKE) -C $(PGO_OBJDIR) package OBJDIR=${PGO_OBJDIR} JARLOG_DIR=${PGO_OBJDIR}/jarlog/en-US $(PROFILE_GEN_SCRIPT) + $(MAKE) -f $(TOPSRCDIR)/client.mk maybe_clobber_profiledbuild $(MAKE) -f $(TOPSRCDIR)/client.mk realbuild MOZ_PROFILE_USE=1 ##################################################### @@ -253,7 +254,7 @@ endif # loop through them. ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_BUILD_PROJECTS),,1)) -configure depend realbuild install export libs clean realclean distclean alldep preflight postflight upload sdk:: +configure depend realbuild install export libs clean realclean distclean alldep preflight postflight maybe_clobber_profiledbuild upload sdk:: set -e; \ for app in $(MOZ_BUILD_PROJECTS); do \ $(MAKE) -f $(TOPSRCDIR)/client.mk $@ MOZ_CURRENT_PROJECT=$$app; \ @@ -353,7 +354,7 @@ realbuild:: $(OBJDIR)/Makefile $(OBJDIR)/config.status # Other targets # Pass these target onto the real build system -install export libs clean realclean distclean alldep upload sdk:: $(OBJDIR)/Makefile $(OBJDIR)/config.status +install export libs clean realclean distclean alldep maybe_clobber_profiledbuild upload sdk:: $(OBJDIR)/Makefile $(OBJDIR)/config.status $(MOZ_MAKE) $@ #################################### @@ -412,4 +413,4 @@ echo-variable-%: # in parallel. .NOTPARALLEL: -.PHONY: checkout real_checkout depend realbuild build profiledbuild export libs alldep install clean realclean distclean cleansrcdir pull_all build_all clobber clobber_all pull_and_build_all everything configure preflight_all preflight postflight postflight_all upload sdk +.PHONY: checkout real_checkout depend realbuild build profiledbuild maybe_clobber_profiledbuild export libs alldep install clean realclean distclean cleansrcdir pull_all build_all clobber clobber_all pull_and_build_all everything configure preflight_all preflight postflight postflight_all upload sdk diff --git a/config/rules.mk b/config/rules.mk index 0d80aea302dd..451ce614144c 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -898,9 +898,6 @@ ifdef SHARED_LIBRARY $(SHARED_LIBRARY_NAME) $(DIST)/$(MOZ_APP_NAME) endif endif # SHARED_LIBRARY || PROGRAM -else # ! WINNT_ -# Force rebuilding all objects on the second pass -$(OBJS): FORCE endif # WINNT_ endif # MOZ_PROFILE_USE ifdef MOZ_PROFILE_GENERATE diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index 0d80aea302dd..451ce614144c 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -898,9 +898,6 @@ ifdef SHARED_LIBRARY $(SHARED_LIBRARY_NAME) $(DIST)/$(MOZ_APP_NAME) endif endif # SHARED_LIBRARY || PROGRAM -else # ! WINNT_ -# Force rebuilding all objects on the second pass -$(OBJS): FORCE endif # WINNT_ endif # MOZ_PROFILE_USE ifdef MOZ_PROFILE_GENERATE From 57cb2d27fa6047155bfd00fc03d3d4b67899b359 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 19 Aug 2011 14:22:52 -0400 Subject: [PATCH 13/15] Backed out bug 679864 because of mochitest-1 oranges --- content/canvas/test/webgl/00_test_list.txt | 1 - content/canvas/test/webgl/README.mozilla | 6 +- .../test/webgl/conformance/00_test_list.txt | 20 +- .../webgl/conformance/array-buffer-crash.html | 7 +- .../conformance/array-buffer-view-crash.html | 7 +- .../webgl/conformance/array-unit-tests.html | 43 +- .../webgl/conformance/bad-arguments-test.html | 4 +- .../webgl/conformance/buffer-bind-test.html | 10 +- .../conformance/buffer-data-array-buffer.html | 4 +- .../conformance/buffer-offscreen-test.html | 92 -- .../conformance/buffer-preserve-test.html | 65 +- .../test/webgl/conformance/canvas-test.html | 9 +- .../webgl/conformance/canvas-zero-size.html | 42 - .../test/webgl/conformance/constants.html | 7 +- ...ributes-alpha-depth-stencil-antialias.html | 69 +- .../conformance/context-lost-restored.html | 74 +- .../test/webgl/conformance/context-lost.html | 11 +- .../webgl/conformance/context-type-test.html | 14 +- .../copy-tex-image-and-sub-image-2d.html | 4 +- .../draw-arrays-out-of-bounds.html | 4 +- .../draw-elements-out-of-bounds.html | 4 +- .../drawingbuffer-static-canvas-test.html | 61 - .../webgl/conformance/drawingbuffer-test.html | 60 - .../webgl/conformance/error-reporting.html | 4 +- .../framebuffer-object-attachment.html | 162 +-- .../webgl/conformance/framebuffer-test.html | 9 +- .../webgl/conformance/get-active-test.html | 5 +- .../gl-bind-attrib-location-test.html | 12 +- .../test/webgl/conformance/gl-clear.html | 6 +- .../webgl/conformance/gl-drawelements.html | 10 +- .../conformance/gl-enable-enum-test.html | 10 +- .../conformance/gl-enable-vertex-attrib.html | 7 +- .../test/webgl/conformance/gl-enum-tests.html | 10 +- .../test/webgl/conformance/gl-fragcoord.html | 84 -- .../conformance/gl-get-active-attribute.html | 10 +- .../conformance/gl-get-active-uniform.html | 10 +- .../test/webgl/conformance/gl-get-calls.html | 10 +- .../test/webgl/conformance/gl-geterror.html | 77 - .../webgl/conformance/gl-getshadersource.html | 12 +- .../test/webgl/conformance/gl-getstring.html | 10 +- .../webgl/conformance/gl-min-attribs.html | 11 +- .../conformance/gl-min-textures-unroll.html | 86 ++ .../webgl/conformance/gl-min-textures.html | 12 +- .../webgl/conformance/gl-min-uniforms.html | 14 +- .../conformance/gl-object-get-calls.html | 8 +- .../webgl/conformance/gl-pixelstorei.html | 10 +- .../webgl/conformance/gl-scissor-test.html | 10 +- .../webgl/conformance/gl-shader-test.html | 10 +- .../test/webgl/conformance/gl-teximage.html | 6 +- .../webgl/conformance/gl-uniform-arrays.html | 12 +- .../webgl/conformance/gl-uniform-bool.html | 10 +- .../conformance/gl-uniformmatrix4fv.html | 7 +- .../webgl/conformance/gl-unknown-uniform.html | 10 +- .../gl-vertex-attrib-zero-issues.html | 6 +- .../webgl/conformance/gl-vertex-attrib.html | 7 +- .../gl-vertexattribpointer-offsets.html | 192 --- .../conformance/gl-vertexattribpointer.html | 10 +- .../glsl-2types-of-textures-on-same-unit.html | 15 +- .../webgl/conformance/glsl-conformance.html | 393 ++--- .../test/webgl/conformance/glsl-features.html | 234 --- .../conformance/glsl-long-variable-names.html | 130 -- .../incorrect-context-object-behaviour.html | 4 +- .../index-validation-copies-indices.html | 4 +- ...validation-crash-with-buffer-sub-data.html | 4 +- ...-validation-verifies-too-many-indices.html | 4 +- .../index-validation-with-resized-buffer.html | 6 +- .../webgl/conformance/index-validation.html | 4 +- .../webgl/conformance/instanceof-test.html | 12 +- .../webgl/conformance/invalid-UTF-16.html | 4 +- .../conformance/invalid-passed-params.html | 6 +- .../test/webgl/conformance/is-object.html | 2 - .../test/webgl/conformance/methods.html | 7 +- .../conformance/more-than-65536-points.html | 8 +- .../webgl/conformance/more/00_test_list.txt | 2 +- .../webgl/conformance/more/all_tests.html | 3 +- .../conformance/more/all_tests_linkonly.html | 3 +- .../more/all_tests_sequential.html | 3 +- .../conformance/badArgsArityLessThanArgc.html | 6 +- .../more/conformance/constants.html | 6 +- .../more/conformance/fuzzTheAPI.html | 4 +- .../more/conformance/getContext.html | 4 +- .../conformance/more/conformance/methods.html | 6 +- .../more/conformance/quickCheckAPI.html | 4 +- .../conformance/quickCheckAPIBadArgs.html | 4 +- .../more/conformance/webGLArrays.html | 9 +- .../conformance/more/demos/opengl_web.html | 51 +- .../webgl/conformance/more/demos/video.html | 6 +- .../more/functions/bindBuffer.html | 6 +- .../more/functions/bindBufferBadArgs.html | 6 +- .../bindFramebufferLeaveNonZero.html | 4 +- .../more/functions/bufferData.html | 4 +- .../more/functions/bufferDataBadArgs.html | 4 +- .../more/functions/bufferSubData.html | 4 +- .../more/functions/bufferSubDataBadArgs.html | 4 +- .../more/functions/copyTexImage2D.html | 11 +- .../more/functions/copyTexImage2DBadArgs.html | 6 +- .../more/functions/copyTexSubImage2D.html | 11 +- .../functions/copyTexSubImage2DBadArgs.html | 6 +- .../more/functions/deleteBufferBadArgs.html | 4 +- .../more/functions/drawArrays.html | 11 +- .../more/functions/drawArraysOutOfBounds.html | 11 +- .../more/functions/drawElements.html | 11 +- .../more/functions/drawElementsBadArgs.html | 11 +- .../conformance/more/functions/isTests.html | 6 +- .../more/functions/readPixels.html | 6 +- .../more/functions/readPixelsBadArgs.html | 19 +- .../more/functions/texImage2D.html | 6 +- .../more/functions/texImage2DBadArgs.html | 6 +- .../more/functions/texImage2DHTML.html | 19 +- .../more/functions/texImage2DHTMLBadArgs.html | 4 +- .../more/functions/texSubImage2D.html | 6 +- .../more/functions/texSubImage2DBadArgs.html | 6 +- .../more/functions/texSubImage2DHTML.html | 25 +- .../functions/texSubImage2DHTMLBadArgs.html | 4 +- .../more/functions/uniformMatrix.html | 8 +- .../more/functions/uniformMatrixBadArgs.html | 8 +- .../conformance/more/functions/uniformf.html | 9 +- .../more/functions/uniformfArrayLen1.html | 9 +- .../more/functions/uniformfBadArgs.html | 9 +- .../conformance/more/functions/uniformi.html | 9 +- .../more/functions/uniformiBadArgs.html | 8 +- .../more/functions/vertexAttrib.html | 11 +- .../more/functions/vertexAttribBadArgs.html | 11 +- .../more/functions/vertexAttribPointer.html | 11 +- .../functions/vertexAttribPointerBadArgs.html | 11 +- .../more/glsl/arrayOutOfBounds.html | 36 +- .../conformance/more/glsl/longLoops.html | 35 +- .../more/glsl/uniformOutOfBounds.html | 36 +- .../more/glsl/unusedAttribsUniforms.html | 16 +- .../test/webgl/conformance/more/index.html | 1 - .../more/performance/CPUvsGPU.html | 21 +- .../more/performance/bandwidth.html | 16 +- .../more/performance/jsGCPause.html | 4 +- .../more/performance/jsMatrixMult.html | 4 +- .../more/performance/jsToGLOverhead.html | 4 +- .../test/webgl/conformance/more/unit.js | 2 +- .../test/webgl/conformance/more/util.js | 2 +- .../conformance/null-object-behaviour.html | 4 +- .../conformance/null-uniform-location.html | 4 +- .../object-deletion-behaviour.html | 10 +- .../conformance/oes-standard-derivatives.html | 11 +- .../webgl/conformance/oes-texture-float.html | 15 +- .../conformance/oes-vertex-array-object.html | 7 +- .../conformance/origin-clean-conformance.html | 100 +- .../test/webgl/conformance/point-size.html | 6 +- .../conformance/premultiplyalpha-test.html | 143 -- .../test/webgl/conformance/program-test.html | 15 +- .../read-pixels-pack-alignment.html | 6 +- .../webgl/conformance/read-pixels-test.html | 7 +- .../renderbuffer-initialization.html | 4 +- .../conformance/resource-sharing-test.html | 11 +- .../conformance/resources/fragmentShader.frag | 4 + .../conformance/resources/npot-video.mp4 | Bin 38215 -> 0 bytes .../resources/npot-video.theora.ogv | Bin 24630 -> 0 bytes .../resources/npot-video.webmvp8.webm | Bin 51240 -> 0 bytes .../conformance/resources/vertexShader.vert | 5 + .../conformance/resources/webgl-test-utils.js | 49 +- .../webgl/conformance/resources/webgl-test.js | 4 +- .../conformance/shaders/00_test_list.txt | 2 - .../shaders/glsl-features/00_test_list.txt | 48 - .../shaders/glsl-features/abs-ref.frag | 23 - .../shaders/glsl-features/abs-ref.vert | 32 - .../shaders/glsl-features/abs-vec2-ref.frag | 28 - .../shaders/glsl-features/abs-vec2-ref.vert | 37 - .../shaders/glsl-features/abs-vec2.frag | 18 - .../shaders/glsl-features/abs-vec2.vert | 27 - .../shaders/glsl-features/abs-vec3-ref.frag | 28 - .../shaders/glsl-features/abs-vec3-ref.vert | 37 - .../shaders/glsl-features/abs-vec3.frag | 17 - .../shaders/glsl-features/abs-vec3.vert | 26 - .../shaders/glsl-features/abs-vec4-ref.frag | 27 - .../shaders/glsl-features/abs-vec4-ref.vert | 36 - .../shaders/glsl-features/abs-vec4.frag | 15 - .../shaders/glsl-features/abs-vec4.vert | 24 - .../shaders/glsl-features/abs.frag | 19 - .../shaders/glsl-features/abs.vert | 28 - .../shaders/glsl-features/base.frag | 15 - .../shaders/glsl-features/base.vert | 21 - .../shaders/glsl-features/ceil-ref.frag | 24 - .../shaders/glsl-features/ceil-ref.vert | 33 - .../shaders/glsl-features/ceil-vec2-ref.frag | 30 - .../shaders/glsl-features/ceil-vec2-ref.vert | 38 - .../shaders/glsl-features/ceil-vec2.frag | 18 - .../shaders/glsl-features/ceil-vec2.vert | 27 - .../shaders/glsl-features/ceil-vec3-ref.frag | 31 - .../shaders/glsl-features/ceil-vec3-ref.vert | 38 - .../shaders/glsl-features/ceil-vec3.frag | 18 - .../shaders/glsl-features/ceil-vec3.vert | 26 - .../shaders/glsl-features/ceil-vec4-ref.frag | 31 - .../shaders/glsl-features/ceil-vec4-ref.vert | 38 - .../shaders/glsl-features/ceil-vec4.frag | 17 - .../shaders/glsl-features/ceil-vec4.vert | 25 - .../shaders/glsl-features/ceil.frag | 18 - .../shaders/glsl-features/ceil.vert | 28 - .../shaders/glsl-features/floor-ref.frag | 23 - .../shaders/glsl-features/floor-ref.vert | 32 - .../shaders/glsl-features/floor-vec2-ref.frag | 29 - .../shaders/glsl-features/floor-vec2-ref.vert | 37 - .../shaders/glsl-features/floor-vec2.frag | 18 - .../shaders/glsl-features/floor-vec2.vert | 27 - .../shaders/glsl-features/floor-vec3-ref.frag | 30 - .../shaders/glsl-features/floor-vec3-ref.vert | 37 - .../shaders/glsl-features/floor-vec3.frag | 18 - .../shaders/glsl-features/floor-vec3.vert | 26 - .../shaders/glsl-features/floor-vec4-ref.frag | 30 - .../shaders/glsl-features/floor-vec4-ref.vert | 37 - .../shaders/glsl-features/floor-vec4.frag | 17 - .../shaders/glsl-features/floor-vec4.vert | 25 - .../shaders/glsl-features/floor.frag | 18 - .../shaders/glsl-features/floor.vert | 28 - .../shaders/glsl-features/fract-ref.frag | 23 - .../shaders/glsl-features/fract-ref.vert | 32 - .../shaders/glsl-features/fract-vec2-ref.frag | 29 - .../shaders/glsl-features/fract-vec2-ref.vert | 37 - .../shaders/glsl-features/fract-vec2.frag | 18 - .../shaders/glsl-features/fract-vec2.vert | 27 - .../shaders/glsl-features/fract-vec3-ref.frag | 30 - .../shaders/glsl-features/fract-vec3-ref.vert | 37 - .../shaders/glsl-features/fract-vec3.frag | 18 - .../shaders/glsl-features/fract-vec3.vert | 26 - .../shaders/glsl-features/fract-vec4-ref.frag | 30 - .../shaders/glsl-features/fract-vec4-ref.vert | 36 - .../shaders/glsl-features/fract-vec4.frag | 16 - .../shaders/glsl-features/fract-vec4.vert | 24 - .../shaders/glsl-features/fract.frag | 18 - .../shaders/glsl-features/fract.vert | 28 - .../shaders/glsl-features/sign-ref.frag | 26 - .../shaders/glsl-features/sign-ref.vert | 29 - .../shaders/glsl-features/sign-vec2-ref.frag | 31 - .../shaders/glsl-features/sign-vec2-ref.vert | 32 - .../shaders/glsl-features/sign-vec2.frag | 18 - .../shaders/glsl-features/sign-vec2.vert | 23 - .../shaders/glsl-features/sign-vec3-ref.frag | 32 - .../shaders/glsl-features/sign-vec3-ref.vert | 31 - .../shaders/glsl-features/sign-vec3.frag | 18 - .../shaders/glsl-features/sign-vec3.vert | 22 - .../shaders/glsl-features/sign-vec4-ref.frag | 32 - .../shaders/glsl-features/sign-vec4-ref.vert | 35 - .../shaders/glsl-features/sign-vec4.frag | 17 - .../shaders/glsl-features/sign-vec4.vert | 22 - .../shaders/glsl-features/sign.frag | 19 - .../shaders/glsl-features/sign.vert | 24 - .../conformance/shaders/misc/00_shaders.txt | 2 - .../conformance/shaders/misc/shared-a.frag | 34 - .../conformance/shaders/misc/shared-b.frag | 31 - .../conformance/shaders/misc/shared.vert | 41 - ...d-sub-image-2d-with-array-buffer-view.html | 5 +- ...ex-image-and-sub-image-2d-with-canvas.html | 115 -- ...mage-and-sub-image-2d-with-image-data.html | 5 +- ...tex-image-and-sub-image-2d-with-image.html | 43 +- ...tex-image-and-sub-image-2d-with-video.html | 8 +- .../tex-image-and-uniform-binding-bugs.html | 4 +- .../tex-image-with-format-and-type.html | 4 +- .../tex-image-with-invalid-data.html | 8 +- .../conformance/tex-input-validation.html | 4 +- .../tex-sub-image-2d-bad-args.html | 2 - .../webgl/conformance/tex-sub-image-2d.html | 9 +- .../webgl/conformance/texparameter-test.html | 16 +- .../conformance/texture-active-bind-2.html | 16 +- .../conformance/texture-active-bind.html | 6 +- .../webgl/conformance/texture-complete.html | 6 +- .../conformance/texture-formats-test.html | 10 +- .../webgl/conformance/texture-npot-video.html | 156 -- .../test/webgl/conformance/texture-npot.html | 12 +- ...exture-transparent-pixels-initialized.html | 4 +- .../test/webgl/conformance/triangle.html | 4 +- .../conformance/type-conversion-test.html | 4 +- .../webgl/conformance/uniform-location.html | 4 +- .../conformance/uniform-samplers-test.html | 11 +- .../webgl/conformance/uninitialized-test.html | 4 +- .../viewport-unchanged-upon-resize.html | 3 +- .../webgl/conformance/webgl-specific.html | 10 +- .../test/webgl/delete-quickCheckAPI.patch | 19 + .../test/webgl/disable-gl-min-textures.patch | 24 + .../webgl/dont-load-image-from-internet.patch | 1292 +---------------- .../test/webgl/extra/big-fbos-example.html | 2 +- .../webgl/extra/canvas-compositing-test.html | 1 - .../test/webgl/extra/fbo-lost-context.html | 2 +- .../webgl/extra/lots-of-polys-example.html | 4 - .../test/webgl/extra/out-of-memory.html | 2 +- .../test/webgl/extra/out-of-resources.html | 2 +- .../test/webgl/extra/slow-shader-example.html | 13 +- .../canvas/test/webgl/extra/webgl-info.html | 1 - .../canvas/test/webgl/failing_tests_linux.txt | 22 +- .../canvas/test/webgl/failing_tests_mac.txt | 18 +- .../test/webgl/failing_tests_windows.txt | 7 - .../test/webgl/increase-timeout-delays.patch | 38 + .../test/webgl/misc/program-test-1.html | 3 +- .../test_webgl_conformance_test_suite.html | 10 - .../test/webgl/webgl-conformance-tests.html | 15 +- 290 files changed, 1222 insertions(+), 6396 deletions(-) delete mode 100644 content/canvas/test/webgl/conformance/buffer-offscreen-test.html delete mode 100644 content/canvas/test/webgl/conformance/canvas-zero-size.html delete mode 100644 content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html delete mode 100644 content/canvas/test/webgl/conformance/drawingbuffer-test.html delete mode 100755 content/canvas/test/webgl/conformance/gl-fragcoord.html delete mode 100644 content/canvas/test/webgl/conformance/gl-geterror.html create mode 100644 content/canvas/test/webgl/conformance/gl-min-textures-unroll.html delete mode 100755 content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html delete mode 100755 content/canvas/test/webgl/conformance/glsl-features.html delete mode 100644 content/canvas/test/webgl/conformance/glsl-long-variable-names.html delete mode 100644 content/canvas/test/webgl/conformance/premultiplyalpha-test.html delete mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.mp4 delete mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.theora.ogv delete mode 100644 content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm delete mode 100755 content/canvas/test/webgl/conformance/shaders/00_test_list.txt delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert delete mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag delete mode 100755 content/canvas/test/webgl/conformance/shaders/misc/shared.vert delete mode 100644 content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html delete mode 100644 content/canvas/test/webgl/conformance/texture-npot-video.html create mode 100644 content/canvas/test/webgl/delete-quickCheckAPI.patch create mode 100644 content/canvas/test/webgl/disable-gl-min-textures.patch create mode 100644 content/canvas/test/webgl/increase-timeout-delays.patch diff --git a/content/canvas/test/webgl/00_test_list.txt b/content/canvas/test/webgl/00_test_list.txt index ef8cb3dbbc60..a04e846d4134 100644 --- a/content/canvas/test/webgl/00_test_list.txt +++ b/content/canvas/test/webgl/00_test_list.txt @@ -2,5 +2,4 @@ // other lines are assumed to be .html files conformance/00_test_list.txt -conformance/more/00_test_list.txt diff --git a/content/canvas/test/webgl/README.mozilla b/content/canvas/test/webgl/README.mozilla index 0efeebab5e31..de4caffcdc8d 100644 --- a/content/canvas/test/webgl/README.mozilla +++ b/content/canvas/test/webgl/README.mozilla @@ -1,15 +1,13 @@ -This is a local copy of the WebGL conformance suite, SVN revision 15318 +This is a local copy of the WebGL conformance suite, version 1.0.0. The canonical location for this testsuite is: - https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/webgl-conformance-tests.html + https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/conformance-suites/1.0.0/webgl-conformance-tests.html All files and directories in this directory, with the exceptions listed below, come from upstream and should not be modified without corresponding upstream fixes and/or a patch file in this directory. The exceptions (the Mozilla-specific files) are: - * the crossorigin directory is not from upstream (not easy to share, as it relies on special features of the HTTP server used for our test framework) * README.mozilla (this file) * failing_tests_*.txt * Makefile.in * *.patch files, if any - diff --git a/content/canvas/test/webgl/conformance/00_test_list.txt b/content/canvas/test/webgl/conformance/00_test_list.txt index 423fbfe9647c..86d0dba26042 100644 --- a/content/canvas/test/webgl/conformance/00_test_list.txt +++ b/content/canvas/test/webgl/conformance/00_test_list.txt @@ -5,9 +5,7 @@ bad-arguments-test.html buffer-bind-test.html buffer-data-array-buffer.html buffer-preserve-test.html -buffer-offscreen-test.html canvas-test.html -canvas-zero-size.html constants.html context-attributes-alpha-depth-stencil-antialias.html context-lost-restored.html @@ -16,8 +14,6 @@ context-type-test.html copy-tex-image-and-sub-image-2d.html draw-arrays-out-of-bounds.html draw-elements-out-of-bounds.html -drawingbuffer-static-canvas-test.html -drawingbuffer-test.html error-reporting.html framebuffer-object-attachment.html framebuffer-test.html @@ -28,16 +24,13 @@ gl-drawelements.html gl-enable-enum-test.html gl-enable-vertex-attrib.html gl-enum-tests.html -gl-fragcoord.html -shaders/00_test_list.txt gl-get-active-attribute.html gl-get-active-uniform.html gl-get-calls.html -gl-geterror.html gl-getshadersource.html gl-getstring.html gl-min-attribs.html -gl-min-textures.html +# gl-min-textures.html gl-min-uniforms.html gl-object-get-calls.html gl-pixelstorei.html @@ -48,13 +41,11 @@ gl-uniform-arrays.html gl-uniform-bool.html gl-uniformmatrix4fv.html gl-unknown-uniform.html -gl-vertex-attrib-zero-issues.html gl-vertex-attrib.html +gl-vertex-attrib-zero-issues.html gl-vertexattribpointer.html -gl-vertexattribpointer-offsets.html #glsl-2types-of-textures-on-same-unit.html glsl-conformance.html -glsl-long-variable-names.html incorrect-context-object-behaviour.html index-validation-copies-indices.html index-validation-crash-with-buffer-sub-data.html @@ -73,16 +64,14 @@ object-deletion-behaviour.html oes-standard-derivatives.html oes-texture-float.html oes-vertex-array-object.html -origin-clean-conformance.html +# origin-clean-conformance.html # is obsolete because of bug 656277 point-size.html -premultiplyalpha-test.html program-test.html read-pixels-pack-alignment.html read-pixels-test.html renderbuffer-initialization.html resource-sharing-test.html tex-image-and-sub-image-2d-with-array-buffer-view.html -tex-image-and-sub-image-2d-with-canvas.html tex-image-and-sub-image-2d-with-image-data.html tex-image-and-sub-image-2d-with-image.html tex-image-and-sub-image-2d-with-video.html @@ -98,7 +87,6 @@ texture-active-bind.html texture-complete.html texture-formats-test.html texture-npot.html -texture-npot-video.html texture-transparent-pixels-initialized.html triangle.html type-conversion-test.html @@ -107,3 +95,5 @@ uniform-samplers-test.html uninitialized-test.html viewport-unchanged-upon-resize.html webgl-specific.html +more/00_test_list.txt + diff --git a/content/canvas/test/webgl/conformance/array-buffer-crash.html b/content/canvas/test/webgl/conformance/array-buffer-crash.html index 4ee8fb4eeb3c..0a571a17e5b7 100644 --- a/content/canvas/test/webgl/conformance/array-buffer-crash.html +++ b/content/canvas/test/webgl/conformance/array-buffer-crash.html @@ -1,11 +1,10 @@ - @@ -34,5 +33,9 @@ successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/array-buffer-view-crash.html b/content/canvas/test/webgl/conformance/array-buffer-view-crash.html index 6a468a1f9ef3..4a98d189fcdd 100644 --- a/content/canvas/test/webgl/conformance/array-buffer-view-crash.html +++ b/content/canvas/test/webgl/conformance/array-buffer-view-crash.html @@ -1,5 +1,5 @@ - - @@ -61,5 +59,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/array-unit-tests.html b/content/canvas/test/webgl/conformance/array-unit-tests.html index 26cf44102a6a..e90a8d4c87d8 100644 --- a/content/canvas/test/webgl/conformance/array-unit-tests.html +++ b/content/canvas/test/webgl/conformance/array-unit-tests.html @@ -1,6 +1,6 @@ - - @@ -512,11 +510,7 @@ function testConstructionWithOutOfRangeValues(type, name) { shouldThrowIndexSizeErr(function() { var buffer = new ArrayBuffer(4); var array = new type(buffer, 4, 0x3FFFFFFF); - }, "Construction of " + name + " with out-of-range number of elements"); - shouldThrowIndexSizeErr(function() { - var buffer = new ArrayBuffer(4); - var array = new type(buffer, 8); - }, "Construction of " + name + " with out-of-range offset"); + }, "Construction of " + name + " with out-of-range values"); } function testConstructionWithNegativeOutOfRangeValues(type, name) { @@ -581,21 +575,6 @@ function testConstructionWithBothArrayBufferAndLength(type, name, elementSizeInB } } -function testConstructionWithSubPortionOfArrayBuffer(type, name, elementSizeInBytes) { - if (elementSizeInBytes > 1) { - // Test construction with a valid sub-portion of an array buffer - // (whose size is not an integral multiple of the element size). - var size = 4 * elementSizeInBytes + (elementSizeInBytes / 2); - var buf = new ArrayBuffer(size); - try { - var array = new type(buf, 0, 2); - testPassed("new " + name + "(new ArrayBuffer(" + size + "), 0, 2) succeeded"); - } catch (e) { - testFailed("new " + name + "(new ArrayBuffer(" + size + "), 0, 2) failed: " + e); - } - } -} - // These need to be global for shouldBe to see them var array; var typeSize; @@ -725,12 +704,6 @@ function testNaNConversion(type, name) { results[i] = array[i]; } break; - case Float64Array: - for (var i = 0; i < array.length; ++i) { - array[i] = NaN; - results[i] = array[i]; - } - break; case Int8Array: for (var i = 0; i < array.length; ++i) { array[i] = NaN; @@ -773,7 +746,7 @@ function testNaNConversion(type, name) { } // Some types preserve NaN values; all other types convert NaN to zero. - if (type === Float32Array || type === Float64Array) { + if (type === Float32Array) { assert('initial NaN preserved', isNaN(new type([NaN])[0])); for (var i = 0; i < array.length; ++i) assert('NaN preserved via setter', isNaN(results[i])); @@ -806,13 +779,6 @@ function runTests() { testValues: [ -500.5, 500.5 ], expectedValues: [ -500.5, 500.5 ] }, - {name: "Float64Array", - unsigned: false, - integral: false, - elementSizeInBytes: 8, - testValues: [ -500.5, 500.5 ], - expectedValues: [ -500.5, 500.5 ] - }, {name: "Int8Array", unsigned: false, integral: true, @@ -900,7 +866,6 @@ function runTests() { testConstructionWithUnalignedLength(type, name, testCase.elementSizeInBytes); testConstructionOfHugeArray(type, name, testCase.elementSizeInBytes); testConstructionWithBothArrayBufferAndLength(type, name, testCase.elementSizeInBytes); - testConstructionWithSubPortionOfArrayBuffer(type, name, testCase.elementSizeInBytes); testSubarrayWithOutOfRangeValues(type, name, testCase.elementSizeInBytes); testSubarrayWithDefaultValues(type, name, testCase.elementSizeInBytes); testSettingFromArrayWithOutOfRangeOffset(type, name); diff --git a/content/canvas/test/webgl/conformance/bad-arguments-test.html b/content/canvas/test/webgl/conformance/bad-arguments-test.html index df0c5037d057..3b38115952fc 100644 --- a/content/canvas/test/webgl/conformance/bad-arguments-test.html +++ b/content/canvas/test/webgl/conformance/bad-arguments-test.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/buffer-bind-test.html b/content/canvas/test/webgl/conformance/buffer-bind-test.html index fd231cd777c2..4f6fd7e443b5 100644 --- a/content/canvas/test/webgl/conformance/buffer-bind-test.html +++ b/content/canvas/test/webgl/conformance/buffer-bind-test.html @@ -1,12 +1,12 @@ - + - WebGL BindBuffer conformance test. @@ -56,8 +56,12 @@ if (!gl) { debug(""); successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html b/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html index 94314770c141..f4ac10b1c7bc 100644 --- a/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html +++ b/content/canvas/test/webgl/conformance/buffer-data-array-buffer.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/buffer-offscreen-test.html b/content/canvas/test/webgl/conformance/buffer-offscreen-test.html deleted file mode 100644 index e47475987902..000000000000 --- a/content/canvas/test/webgl/conformance/buffer-offscreen-test.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - -WebGL required buffer clear behaviour test - - - - - - - - -
- -
- - - diff --git a/content/canvas/test/webgl/conformance/buffer-preserve-test.html b/content/canvas/test/webgl/conformance/buffer-preserve-test.html index eb7cc2bbb59d..338ae589169e 100644 --- a/content/canvas/test/webgl/conformance/buffer-preserve-test.html +++ b/content/canvas/test/webgl/conformance/buffer-preserve-test.html @@ -1,7 +1,6 @@ - WebGL required buffer clear behaviour test @@ -15,30 +14,37 @@ body { @@ -187,6 +188,8 @@ if (!gl) { }, 1000/30); } + diff --git a/content/canvas/test/webgl/conformance/canvas-zero-size.html b/content/canvas/test/webgl/conformance/canvas-zero-size.html deleted file mode 100644 index 200ee93a231c..000000000000 --- a/content/canvas/test/webgl/conformance/canvas-zero-size.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Zero Size Canvas Test - - - - - - -
-
- - - - - diff --git a/content/canvas/test/webgl/conformance/constants.html b/content/canvas/test/webgl/conformance/constants.html index 8e850919cd2e..33a0222e352e 100644 --- a/content/canvas/test/webgl/conformance/constants.html +++ b/content/canvas/test/webgl/conformance/constants.html @@ -1,12 +1,11 @@ - - + WebGL Constants Test @@ -482,6 +481,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html b/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html index 5dc4ecd39b30..67e7a00d3f22 100644 --- a/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html +++ b/content/canvas/test/webgl/conformance/context-attributes-alpha-depth-stencil-antialias.html @@ -1,12 +1,10 @@ - - @@ -23,8 +21,9 @@ void main() + + + + + + + +
diff --git a/content/canvas/test/webgl/conformance/context-lost-restored.html b/content/canvas/test/webgl/conformance/context-lost-restored.html index ec54cd0d7ad5..56443a477998 100644 --- a/content/canvas/test/webgl/conformance/context-lost-restored.html +++ b/content/canvas/test/webgl/conformance/context-lost-restored.html @@ -1,7 +1,5 @@ - - @@ -17,7 +15,6 @@ var bufferObjects; var program; var texture; var texColor = [255, 10, 20, 255]; -var allowRestore; function init() { @@ -25,66 +22,24 @@ function init() window.initNonKhronosFramework(true); } - description("Tests behavior under a restored context."); + description("Tests behavior under a restored context"); - shouldGenerateGLError = wtu.shouldGenerateGLError; - runTests(); -} + canvas = document.getElementById("canvas"); + canvas.addEventListener("webglcontextlost", testLostContext, false); + canvas.addEventListener("webglcontextrestored", testRestoredContext, false); -function runTests() -{ - testLosingContext(); - testLosingAndRestoringContext(); - - finish(); -} - -function setupTest() -{ - canvas = document.createElement("canvas"); - canvas.width = 1; - canvas.height = 1; gl = wtu.create3DContext(canvas); + shouldGenerateGLError = wtu.shouldGenerateGLError; + extension = gl.getExtension(extension_name); if (!extension) { debug(extension_name + " extension not found."); - return false; + finish(); + return; } - return true; -} - -function testLosingContext() -{ - if (!setupTest()) - return; - - debug("Test losing a context and inability to restore it."); - - canvas.addEventListener("webglcontextlost", testLostContext); - canvas.addEventListener("webglcontextrestored", testShouldNotRestoreContext); - allowRestore = false; testOriginalContext(); extension.loseContext(); - shouldGenerateGLError(gl, gl.INVALID_OPERATION, "extension.restoreContext()"); - debug(""); -} - -function testLosingAndRestoringContext() -{ - if (!setupTest()) - return; - - debug("Test losing and restoring a context."); - - canvas.addEventListener("webglcontextlost", testLostContext); - canvas.addEventListener("webglcontextrestored", testRestoredContext); - allowRestore = true; - - testOriginalContext(); - extension.loseContext(); - shouldGenerateGLError(gl, gl.NO_ERROR, "extension.restoreContext()"); - debug(""); } function testRendering() @@ -115,21 +70,13 @@ function testOriginalContext() debug(""); } -function testLostContext(e) +function testLostContext() { debug("Test lost context"); shouldBeTrue("gl.isContextLost()"); shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL"); shouldBe("gl.getError()", "gl.NO_ERROR"); debug(""); - if (allowRestore) - e.preventDefault(); -} - -function testShouldNotRestoreContext(e) -{ - testFailed("Should not restore the context unless preventDefault is called on the context lost event"); - debug(""); } function testResources(expected) @@ -158,6 +105,8 @@ function testRestoredContext() // Validate new resources created in testRendering(). testResources(gl.NO_ERROR); debug(""); + + finish(); } function finish() { @@ -176,5 +125,6 @@ function finish() {
+ diff --git a/content/canvas/test/webgl/conformance/context-lost.html b/content/canvas/test/webgl/conformance/context-lost.html index 4269535669b0..07305bbc7a59 100644 --- a/content/canvas/test/webgl/conformance/context-lost.html +++ b/content/canvas/test/webgl/conformance/context-lost.html @@ -1,7 +1,5 @@ - - @@ -64,9 +62,6 @@ function loseContext() { debug(""); debug("Lose context"); - - // Note: this will cause the context to be lost, and the - // webglcontextlost event listener to be called, immediately. shouldGenerateGLError(gl, gl.NO_ERROR, "extension.loseContext()"); debug(""); } @@ -140,8 +135,8 @@ function testLostContext() "gl.blendColor(1.0, 1.0, 1.0, 1.0)", "gl.blendEquation(gl.FUNC_ADD)", "gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD)", - "gl.blendFunc(gl.ONE, gl.ONE)", - "gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE)", + "gl.blendFunc(gl.ONE)", + "gl.blendFuncSeparate(gl.ONE, gl.ONE)", "gl.bufferData(gl.ARRAY_BUFFER, 0, gl.STATIC_DRAW)", "gl.bufferData(gl.ARRAY_BUFFER, arrayBufferView, gl.STATIC_DRAW)", "gl.bufferData(gl.ARRAY_BUFFER, arrayBuffer, gl.STATIC_DRAW)", @@ -300,8 +295,6 @@ function testLostContext() shouldBe("gl.getError()", "gl.NO_ERROR"); - debug(""); - finish(); } diff --git a/content/canvas/test/webgl/conformance/context-type-test.html b/content/canvas/test/webgl/conformance/context-type-test.html index f763a3d0db2e..0b4f116c67f0 100644 --- a/content/canvas/test/webgl/conformance/context-type-test.html +++ b/content/canvas/test/webgl/conformance/context-type-test.html @@ -1,12 +1,13 @@ - + - + WebGL Canvas Conformance Tests @@ -24,11 +25,6 @@ description("This test ensures WebGL implementations interact correctly with the debug(""); debug("Canvas.getContext"); -assertMsg(window.WebGLRenderingContext, - "WebGLRenderingContext should be a member of window"); -assertMsg('WebGLRenderingContext' in window, - "WebGLRenderingContext should be 'in' window"); - var canvas = document.getElementById("canvas"); var gl = create3DContext(canvas); if (!gl) { @@ -44,6 +40,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html b/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html index 838d2c67d70f..cc48ce91fa86 100644 --- a/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html +++ b/content/canvas/test/webgl/conformance/copy-tex-image-and-sub-image-2d.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html b/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html index 0f0543feeb6c..5474d79ab6e0 100644 --- a/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html +++ b/content/canvas/test/webgl/conformance/draw-arrays-out-of-bounds.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html b/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html index fad679f1b79d..7104d085a96a 100644 --- a/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html +++ b/content/canvas/test/webgl/conformance/draw-elements-out-of-bounds.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html b/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html deleted file mode 100644 index 5760959fdcb6..000000000000 --- a/content/canvas/test/webgl/conformance/drawingbuffer-static-canvas-test.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -WebGL Canvas Conformance Tests - - - - - - -
-
- - - - - diff --git a/content/canvas/test/webgl/conformance/drawingbuffer-test.html b/content/canvas/test/webgl/conformance/drawingbuffer-test.html deleted file mode 100644 index 95b1b0176c83..000000000000 --- a/content/canvas/test/webgl/conformance/drawingbuffer-test.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -WebGL Canvas Conformance Tests - - - - - - -
-
- - - - diff --git a/content/canvas/test/webgl/conformance/error-reporting.html b/content/canvas/test/webgl/conformance/error-reporting.html index d3a74925d6f4..cb54b27d24da 100644 --- a/content/canvas/test/webgl/conformance/error-reporting.html +++ b/content/canvas/test/webgl/conformance/error-reporting.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html b/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html index e22cff8db037..e5caa22f4777 100644 --- a/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html +++ b/content/canvas/test/webgl/conformance/framebuffer-object-attachment.html @@ -1,12 +1,10 @@ - - @@ -23,8 +21,8 @@ var depthBuffer; var stencilBuffer; var depthStencilBuffer; var colorBuffer; -var width; -var height; +var width = 2; +var height = 2; function testAttachment(attachment, buffer, isConflicted) { @@ -33,13 +31,7 @@ function testAttachment(attachment, buffer, isConflicted) gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorBuffer); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, buffer); glErrorShouldBe(gl, gl.NO_ERROR); - // If the framebuffer is in an error state for multiple reasons, - // we can't guarantee which one will be reported. - if ((width == 0 || height == 0) && !isConflicted) { - // Zero-sized renderbuffers are supposed to result in an incomplete attachment. - // However, certain combination may violate implementation specific restrictions. - shouldBeTrue("gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT || gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_UNSUPPORTED"); - } else if (isConflicted) { + if (isConflicted) { shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED"); gl.clear(gl.COLOR_BUFFER_BIT); glErrorShouldBe(gl, gl.INVALID_FRAMEBUFFER_OPERATION); @@ -57,15 +49,8 @@ function testAttachments(attachment0, buffer0, attachment1, buffer1, isConflicte glErrorShouldBe(gl, gl.NO_ERROR); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment1, gl.RENDERBUFFER, buffer1); glErrorShouldBe(gl, gl.NO_ERROR); - // If the framebuffer is in an error state for multiple reasons, - // we can't guarantee which one will be reported. - if ((width == 0 || height == 0) && !isConflicted) { - // Zero-sized renderbuffers are supposed to result in an incomplete attachment. - // However, certain combination may violate implementation specific restrictions. - shouldBeTrue("gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT || gl.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_UNSUPPORTED"); - } else if (isConflicted) { + if (isConflicted) shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED"); - } } function testColorRenderbuffer(internalformat) @@ -83,100 +68,83 @@ function testDepthStencilRenderbuffer() gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); glErrorShouldBe(gl, gl.NO_ERROR); - - // OpenGL itself doesn't seem to guarantee that e.g. a 2 x 0 - // renderbuffer will report 2 for its width when queried. - if (!(height == 0 && width > 0)) - shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width"); - if (!(width == 0 && height > 0)) - shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height"); + shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", "width"); + shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT)", "height"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_INTERNAL_FORMAT)", "gl.DEPTH_STENCIL"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_RED_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_GREEN_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_BLUE_SIZE)", "0"); shouldBe("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_ALPHA_SIZE)", "0"); - // Avoid verifying these for zero-sized renderbuffers for the time - // being since it appears that even OpenGL doesn't guarantee them. - if (width > 0 && height > 0) { - shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0"); - shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0"); - } + shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_DEPTH_SIZE) > 0"); + shouldBeTrue("gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_STENCIL_SIZE) > 0"); glErrorShouldBe(gl, gl.NO_ERROR); testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); } description("Test framebuffer object attachment behaviors"); -for (width = 0; width <= 2; width += 2) -{ - for (height = 0; height <= 2; height += 2) - { - debug("Dimensions " + width + " x " + height); +debug("Create renderbuffers"); +shouldBeNonNull("gl = create3DContext()"); +shouldBeNonNull("colorBuffer = gl.createRenderbuffer()"); +gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer); +gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height); +glErrorShouldBe(gl, gl.NO_ERROR); +shouldBeNonNull("depthBuffer = gl.createRenderbuffer()"); +gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); +gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); +glErrorShouldBe(gl, gl.NO_ERROR); +shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()"); +gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer); +gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height); +glErrorShouldBe(gl, gl.NO_ERROR); +shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()"); +gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); +gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); +glErrorShouldBe(gl, gl.NO_ERROR); - debug("Create renderbuffers"); - shouldBeNonNull("gl = create3DContext()"); - shouldBeNonNull("colorBuffer = gl.createRenderbuffer()"); - gl.bindRenderbuffer(gl.RENDERBUFFER, colorBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height); - glErrorShouldBe(gl, gl.NO_ERROR); - shouldBeNonNull("depthBuffer = gl.createRenderbuffer()"); - gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); - glErrorShouldBe(gl, gl.NO_ERROR); - shouldBeNonNull("stencilBuffer = gl.createRenderbuffer()"); - gl.bindRenderbuffer(gl.RENDERBUFFER, stencilBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, width, height); - glErrorShouldBe(gl, gl.NO_ERROR); - shouldBeNonNull("depthStencilBuffer = gl.createRenderbuffer()"); - gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height); - glErrorShouldBe(gl, gl.NO_ERROR); +debug("Attach depth using DEPTH_ATTACHMENT"); +testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false); +debug("Attach depth using STENCIL_ATTACHMENT"); +testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, true); +debug("Attach depth using DEPTH_STENCIL_ATTACHMENT"); +testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, true); +debug("Attach stencil using STENCIL_ATTACHMENT"); +testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, false); +debug("Attach stencil using DEPTH_ATTACHMENT"); +testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, true); +debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT"); +testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, true); +debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT"); +testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); +debug("Attach depthStencil using DEPTH_ATTACHMENT"); +testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, true); +debug("Attach depthStencil using STENCIL_ATTACHMENT"); +testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, true); - debug("Attach depth using DEPTH_ATTACHMENT"); - testAttachment(gl.DEPTH_ATTACHMENT, depthBuffer, false); - debug("Attach depth using STENCIL_ATTACHMENT"); - testAttachment(gl.STENCIL_ATTACHMENT, depthBuffer, true); - debug("Attach depth using DEPTH_STENCIL_ATTACHMENT"); - testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthBuffer, true); - debug("Attach stencil using STENCIL_ATTACHMENT"); - testAttachment(gl.STENCIL_ATTACHMENT, stencilBuffer, false); - debug("Attach stencil using DEPTH_ATTACHMENT"); - testAttachment(gl.DEPTH_ATTACHMENT, stencilBuffer, true); - debug("Attach stencil using DEPTH_STENCIL_ATTACHMENT"); - testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, stencilBuffer, true); - debug("Attach depthStencil using DEPTH_STENCIL_ATTACHMENT"); - testAttachment(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, false); - debug("Attach depthStencil using DEPTH_ATTACHMENT"); - testAttachment(gl.DEPTH_ATTACHMENT, depthStencilBuffer, true); - debug("Attach depthStencil using STENCIL_ATTACHMENT"); - testAttachment(gl.STENCIL_ATTACHMENT, depthStencilBuffer, true); +debug("Attach depth, then stencil, causing conflict"); +testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); +debug("Attach stencil, then depth, causing conflict"); +testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); +debug("Attach depth, then depthStencil, causing conflict"); +testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); +debug("Attach depthStencil, then depth, causing conflict"); +testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); +debug("Attach stencil, then depthStencil, causing conflict"); +testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); +debug("Attach depthStencil, then stencil, causing conflict"); +testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); - debug("Attach depth, then stencil, causing conflict"); - testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); - debug("Attach stencil, then depth, causing conflict"); - testAttachments(gl.STENCIL_ATTACHMENT, stencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); - debug("Attach depth, then depthStencil, causing conflict"); - testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); - debug("Attach depthStencil, then depth, causing conflict"); - testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.DEPTH_ATTACHMENT, depthBuffer, true); - debug("Attach stencil, then depthStencil, causing conflict"); - testAttachments(gl.DEPTH_ATTACHMENT, depthBuffer, gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, true); - debug("Attach depthStencil, then stencil, causing conflict"); - testAttachments(gl.DEPTH_STENCIL_ATTACHMENT, depthStencilBuffer, gl.STENCIL_ATTACHMENT, stencilBuffer, true); +debug("Attach color renderbuffer with internalformat == RGBA4"); +testColorRenderbuffer(gl.RGBA4); - debug("Attach color renderbuffer with internalformat == RGBA4"); - testColorRenderbuffer(gl.RGBA4); +debug("Attach color renderbuffer with internalformat == RGB5_A1"); +testColorRenderbuffer(gl.RGB5_A1); - debug("Attach color renderbuffer with internalformat == RGB5_A1"); - testColorRenderbuffer(gl.RGB5_A1); +debug("Attach color renderbuffer with internalformat == RGB565"); +testColorRenderbuffer(gl.RGB565); - debug("Attach color renderbuffer with internalformat == RGB565"); - testColorRenderbuffer(gl.RGB565); - - debug("Create and attach depthStencil renderbuffer"); - testDepthStencilRenderbuffer(); - } -} +debug("Create and attach depthStencil renderbuffer"); +testDepthStencilRenderbuffer(); successfullyParsed = true; diff --git a/content/canvas/test/webgl/conformance/framebuffer-test.html b/content/canvas/test/webgl/conformance/framebuffer-test.html index fbd0e6e9bb52..bdc7f1f9bcba 100644 --- a/content/canvas/test/webgl/conformance/framebuffer-test.html +++ b/content/canvas/test/webgl/conformance/framebuffer-test.html @@ -1,12 +1,13 @@ - + - + WebGL Framebuffer Test @@ -167,6 +168,8 @@ successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/get-active-test.html b/content/canvas/test/webgl/conformance/get-active-test.html index bd270c643207..02e0092a8451 100644 --- a/content/canvas/test/webgl/conformance/get-active-test.html +++ b/content/canvas/test/webgl/conformance/get-active-test.html @@ -1,5 +1,5 @@ - + - diff --git a/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html b/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html index 39ef578fb62c..c947fea9b761 100644 --- a/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html +++ b/content/canvas/test/webgl/conformance/gl-bind-attrib-location-test.html @@ -1,12 +1,13 @@ - + - + WebGL BindAttribLocation Conformance Tests @@ -27,8 +28,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/gl-drawelements.html b/content/canvas/test/webgl/conformance/gl-drawelements.html index 1ec4d8d55c40..91e07a372490 100644 --- a/content/canvas/test/webgl/conformance/gl-drawelements.html +++ b/content/canvas/test/webgl/conformance/gl-drawelements.html @@ -1,12 +1,12 @@ - + - WebGL drawElements Test @@ -90,7 +90,11 @@ found in the LICENSE file. init(); successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/gl-enable-enum-test.html b/content/canvas/test/webgl/conformance/gl-enable-enum-test.html index 4808a66fec16..ecdb07f4baf8 100644 --- a/content/canvas/test/webgl/conformance/gl-enable-enum-test.html +++ b/content/canvas/test/webgl/conformance/gl-enable-enum-test.html @@ -1,12 +1,13 @@ - + - + WebGL gl.ENABLE enums Conformance Tests @@ -129,5 +130,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html b/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html index 35dbbb1b8997..68450181b45a 100644 --- a/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html +++ b/content/canvas/test/webgl/conformance/gl-enable-vertex-attrib.html @@ -1,12 +1,11 @@ - WebGL Enable Vertex Attrib Test @@ -50,8 +49,12 @@ glErrorShouldBe(gl, gl.INVALID_OPERATION); successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/gl-enum-tests.html b/content/canvas/test/webgl/conformance/gl-enum-tests.html index 09ec73a5df8c..7647883ef9f9 100644 --- a/content/canvas/test/webgl/conformance/gl-enum-tests.html +++ b/content/canvas/test/webgl/conformance/gl-enum-tests.html @@ -1,12 +1,13 @@ - + - + WebGL gl enums Conformance Tests @@ -82,6 +83,9 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-fragcoord.html b/content/canvas/test/webgl/conformance/gl-fragcoord.html deleted file mode 100755 index 599b2e0cddc4..000000000000 --- a/content/canvas/test/webgl/conformance/gl-fragcoord.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - gl-fragcoord Test - - - - - - - - -
-
- - - - - - - - - diff --git a/content/canvas/test/webgl/conformance/gl-get-active-attribute.html b/content/canvas/test/webgl/conformance/gl-get-active-attribute.html index cc0d18da2d46..1f0aae8a4c20 100644 --- a/content/canvas/test/webgl/conformance/gl-get-active-attribute.html +++ b/content/canvas/test/webgl/conformance/gl-get-active-attribute.html @@ -1,12 +1,12 @@ - + - WebGL getActiveAttrib conformance test. @@ -77,8 +77,12 @@ for (var tt = 0; tt < tests.length; ++tt) { successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/gl-get-active-uniform.html b/content/canvas/test/webgl/conformance/gl-get-active-uniform.html index acd33746caa2..03672867b3e3 100644 --- a/content/canvas/test/webgl/conformance/gl-get-active-uniform.html +++ b/content/canvas/test/webgl/conformance/gl-get-active-uniform.html @@ -1,12 +1,12 @@ - + - WebGL getActiveUniform conformance test. @@ -138,8 +138,12 @@ glErrorShouldBe(gl, gl.INVALID_OPERATION, successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/gl-get-calls.html b/content/canvas/test/webgl/conformance/gl-get-calls.html index 4d490807a7ea..894f6a1fd33e 100644 --- a/content/canvas/test/webgl/conformance/gl-get-calls.html +++ b/content/canvas/test/webgl/conformance/gl-get-calls.html @@ -1,5 +1,5 @@ - - + - + WebGL gl calls Conformance Tests @@ -148,5 +147,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-geterror.html b/content/canvas/test/webgl/conformance/gl-geterror.html deleted file mode 100644 index bba5e7ba67ac..000000000000 --- a/content/canvas/test/webgl/conformance/gl-geterror.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - -WebGL get error conformance test. - - - - - - - - -
- - - - - diff --git a/content/canvas/test/webgl/conformance/gl-getshadersource.html b/content/canvas/test/webgl/conformance/gl-getshadersource.html index 6d137eeb1d49..073a5f4eabcb 100644 --- a/content/canvas/test/webgl/conformance/gl-getshadersource.html +++ b/content/canvas/test/webgl/conformance/gl-getshadersource.html @@ -1,12 +1,13 @@  - + - + WebGL getShaderSource conformance test. @@ -31,8 +32,13 @@ shouldBe("source", "original"); glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors."); successfullyParsed = true; + + + + diff --git a/content/canvas/test/webgl/conformance/gl-getstring.html b/content/canvas/test/webgl/conformance/gl-getstring.html index f4eb2b221c7a..1b71de7236e6 100644 --- a/content/canvas/test/webgl/conformance/gl-getstring.html +++ b/content/canvas/test/webgl/conformance/gl-getstring.html @@ -1,12 +1,13 @@ - + - + WebGL gl.getParameter Strings Conformance Tests @@ -54,5 +55,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-min-attribs.html b/content/canvas/test/webgl/conformance/gl-min-attribs.html index 193bd468ec92..2dd128de85fa 100644 --- a/content/canvas/test/webgl/conformance/gl-min-attribs.html +++ b/content/canvas/test/webgl/conformance/gl-min-attribs.html @@ -1,12 +1,12 @@ - + - WebGL the minimum number of attributes are supported. @@ -35,7 +35,9 @@ void main() + + diff --git a/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html b/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html new file mode 100644 index 000000000000..2783087ccde5 --- /dev/null +++ b/content/canvas/test/webgl/conformance/gl-min-textures-unroll.html @@ -0,0 +1,86 @@ + + + + +WebGL the minimum number of uniforms are supported. + + + + + + + +
+
+ + + + + + + + + + + + + diff --git a/content/canvas/test/webgl/conformance/gl-min-textures.html b/content/canvas/test/webgl/conformance/gl-min-textures.html index 29f6da68d598..ab18e3427ae4 100644 --- a/content/canvas/test/webgl/conformance/gl-min-textures.html +++ b/content/canvas/test/webgl/conformance/gl-min-textures.html @@ -1,12 +1,12 @@ - + - WebGL the minimum number of uniforms are supported. @@ -27,7 +27,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/gl-min-uniforms.html b/content/canvas/test/webgl/conformance/gl-min-uniforms.html index 3db640e27c8f..e3a1e8ad3e9c 100644 --- a/content/canvas/test/webgl/conformance/gl-min-uniforms.html +++ b/content/canvas/test/webgl/conformance/gl-min-uniforms.html @@ -1,12 +1,12 @@ - + - WebGL the minimum number of uniforms are supported. @@ -34,7 +34,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/gl-object-get-calls.html b/content/canvas/test/webgl/conformance/gl-object-get-calls.html index 0224b24563ad..c2c966e45baf 100644 --- a/content/canvas/test/webgl/conformance/gl-object-get-calls.html +++ b/content/canvas/test/webgl/conformance/gl-object-get-calls.html @@ -1,5 +1,5 @@ - - @@ -261,9 +259,9 @@ glErrorShouldBe(gl, gl.NO_ERROR); // Test cases where name == 0 gl.deleteTexture(texture); -shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); +shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)'); gl.deleteRenderbuffer(renderbuffer); -shouldBe('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)', 'gl.NONE'); +shouldBeNull('gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)'); gl.deleteBuffer(buffer); shouldBeNull('gl.getVertexAttrib(1, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)'); glErrorShouldBe(gl, gl.NO_ERROR); diff --git a/content/canvas/test/webgl/conformance/gl-pixelstorei.html b/content/canvas/test/webgl/conformance/gl-pixelstorei.html index 34fda692ffd9..151fe75acfe2 100644 --- a/content/canvas/test/webgl/conformance/gl-pixelstorei.html +++ b/content/canvas/test/webgl/conformance/gl-pixelstorei.html @@ -1,12 +1,12 @@ - + - WebGL pixelStorei Test @@ -119,7 +119,11 @@ function init() { init(); successfullyParsed = true; + + + diff --git a/content/canvas/test/webgl/conformance/gl-scissor-test.html b/content/canvas/test/webgl/conformance/gl-scissor-test.html index b4cc0f8855a7..bbab2dd17ac9 100644 --- a/content/canvas/test/webgl/conformance/gl-scissor-test.html +++ b/content/canvas/test/webgl/conformance/gl-scissor-test.html @@ -1,12 +1,13 @@ - + - + WebGL Scissor Test @@ -69,5 +70,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-shader-test.html b/content/canvas/test/webgl/conformance/gl-shader-test.html index cba94d737861..0138fcb71501 100644 --- a/content/canvas/test/webgl/conformance/gl-shader-test.html +++ b/content/canvas/test/webgl/conformance/gl-shader-test.html @@ -1,12 +1,13 @@ - + - + WebGL ShaderL Conformance Tests @@ -44,5 +45,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-teximage.html b/content/canvas/test/webgl/conformance/gl-teximage.html index 8fd9cfdd217a..b101a9addd3b 100644 --- a/content/canvas/test/webgl/conformance/gl-teximage.html +++ b/content/canvas/test/webgl/conformance/gl-teximage.html @@ -1,12 +1,12 @@ - + - WebGL texImage2D conformance test. diff --git a/content/canvas/test/webgl/conformance/gl-uniform-arrays.html b/content/canvas/test/webgl/conformance/gl-uniform-arrays.html index 72714115a29e..3f939551ab6b 100644 --- a/content/canvas/test/webgl/conformance/gl-uniform-arrays.html +++ b/content/canvas/test/webgl/conformance/gl-uniform-arrays.html @@ -1,12 +1,13 @@ - + - + WebGL uniform array Conformance Tests @@ -25,7 +26,9 @@ found in the LICENSE file. + + diff --git a/content/canvas/test/webgl/conformance/gl-uniform-bool.html b/content/canvas/test/webgl/conformance/gl-uniform-bool.html index dd6e352332a8..f757f48b7595 100644 --- a/content/canvas/test/webgl/conformance/gl-uniform-bool.html +++ b/content/canvas/test/webgl/conformance/gl-uniform-bool.html @@ -1,12 +1,13 @@ - + - + WebGL uniformMatrix Conformance Tests @@ -52,5 +53,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html b/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html index 82ef2d66b7b2..614bc62af466 100644 --- a/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html +++ b/content/canvas/test/webgl/conformance/gl-uniformmatrix4fv.html @@ -1,12 +1,13 @@ - + - + WebGL uniformMatrix Conformance Tests diff --git a/content/canvas/test/webgl/conformance/gl-unknown-uniform.html b/content/canvas/test/webgl/conformance/gl-unknown-uniform.html index d29543d1fe91..197a2952c4de 100644 --- a/content/canvas/test/webgl/conformance/gl-unknown-uniform.html +++ b/content/canvas/test/webgl/conformance/gl-unknown-uniform.html @@ -1,12 +1,13 @@ - + - + WebGL Unknown Uniform Conformance Test @@ -61,5 +62,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html b/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html index 499ee6edbbc6..fda08ac428c4 100644 --- a/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html +++ b/content/canvas/test/webgl/conformance/gl-vertex-attrib-zero-issues.html @@ -1,12 +1,11 @@ - WebGL Enable Vertex Attrib Zero Test @@ -90,6 +89,9 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/gl-vertex-attrib.html b/content/canvas/test/webgl/conformance/gl-vertex-attrib.html index 6934231e52bf..ecea7e2df2cf 100644 --- a/content/canvas/test/webgl/conformance/gl-vertex-attrib.html +++ b/content/canvas/test/webgl/conformance/gl-vertex-attrib.html @@ -1,12 +1,13 @@ - + - + WebGL vertexAttrib Conformance Tests diff --git a/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html b/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html deleted file mode 100755 index e522438b6248..000000000000 --- a/content/canvas/test/webgl/conformance/gl-vertexattribpointer-offsets.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - Rendering Test - - - - - - - -There is supposed to be an example drawing here, but it's not important. - -
-
- - - - - - - - - diff --git a/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html b/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html index ac600f18fff7..87991b18c538 100644 --- a/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html +++ b/content/canvas/test/webgl/conformance/gl-vertexattribpointer.html @@ -1,12 +1,13 @@ - + - + WebGL vertexAttribPointer Conformance Tests @@ -129,5 +130,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html b/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html index 0c1e85d65df2..4fb11b92bc86 100644 --- a/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html +++ b/content/canvas/test/webgl/conformance/glsl-2types-of-textures-on-same-unit.html @@ -1,12 +1,12 @@ - + - WebGL GLSL 2 types of textures on same unit conformance test. @@ -30,8 +30,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/glsl-conformance.html b/content/canvas/test/webgl/conformance/glsl-conformance.html index 598ae8a2ff08..97fd0f2256e2 100644 --- a/content/canvas/test/webgl/conformance/glsl-conformance.html +++ b/content/canvas/test/webgl/conformance/glsl-conformance.html @@ -1,12 +1,13 @@ - + - + WebGL GLSL Conformance Tests @@ -33,8 +34,7 @@ void main() @@ -307,143 +307,6 @@ void main() gl_FragColor = vec4(0,0,0,0); } - - - - - - - - - + + diff --git a/content/canvas/test/webgl/conformance/glsl-features.html b/content/canvas/test/webgl/conformance/glsl-features.html deleted file mode 100755 index 8775985b85ac..000000000000 --- a/content/canvas/test/webgl/conformance/glsl-features.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - - GLSL feature Test - - - - - - - - - - - - - - -
reftestdiff
-
-
- - - - - - diff --git a/content/canvas/test/webgl/conformance/glsl-long-variable-names.html b/content/canvas/test/webgl/conformance/glsl-long-variable-names.html deleted file mode 100644 index bbcf729fba08..000000000000 --- a/content/canvas/test/webgl/conformance/glsl-long-variable-names.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - glsl long variable name mapping tests - - - - - - - There is supposed to be an example drawing here, but it's not important. - -
Verify that shader long variable names works fine if they are within 256 characters.
-
- - - - - - - - diff --git a/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html b/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html index c24b12590581..588401dd8fdb 100644 --- a/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html +++ b/content/canvas/test/webgl/conformance/incorrect-context-object-behaviour.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/index-validation-copies-indices.html b/content/canvas/test/webgl/conformance/index-validation-copies-indices.html index 54f1547867e5..1158628871c5 100644 --- a/content/canvas/test/webgl/conformance/index-validation-copies-indices.html +++ b/content/canvas/test/webgl/conformance/index-validation-copies-indices.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html b/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html index 80ecfa1e456a..fb44226bd067 100644 --- a/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html +++ b/content/canvas/test/webgl/conformance/index-validation-crash-with-buffer-sub-data.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html b/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html index d5c2a6cd1769..e023c7a4e659 100644 --- a/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html +++ b/content/canvas/test/webgl/conformance/index-validation-verifies-too-many-indices.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html b/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html index 5fdceb97329b..260d4c6fbb80 100644 --- a/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html +++ b/content/canvas/test/webgl/conformance/index-validation-with-resized-buffer.html @@ -1,12 +1,10 @@ - - @@ -26,7 +24,9 @@ void main() { } diff --git a/content/canvas/test/webgl/conformance/instanceof-test.html b/content/canvas/test/webgl/conformance/instanceof-test.html index 1e40003081ba..3e5aee4cce16 100644 --- a/content/canvas/test/webgl/conformance/instanceof-test.html +++ b/content/canvas/test/webgl/conformance/instanceof-test.html @@ -1,12 +1,12 @@ - + - WebGL instanceof test. @@ -27,7 +27,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/invalid-UTF-16.html b/content/canvas/test/webgl/conformance/invalid-UTF-16.html index 9b562d1f9d8c..00709aca2b60 100644 --- a/content/canvas/test/webgl/conformance/invalid-UTF-16.html +++ b/content/canvas/test/webgl/conformance/invalid-UTF-16.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/invalid-passed-params.html b/content/canvas/test/webgl/conformance/invalid-passed-params.html index cdf5411d5034..c88a2dec8e05 100644 --- a/content/canvas/test/webgl/conformance/invalid-passed-params.html +++ b/content/canvas/test/webgl/conformance/invalid-passed-params.html @@ -1,5 +1,5 @@ - - @@ -127,7 +125,7 @@ context.shaderSource(vShader, generateShaderSource()); context.compileShader(vShader); shouldBe("context.getError()", "context.NO_ERROR"); var fShader = context.createShader(context.FRAGMENT_SHADER); -context.shaderSource(fShader, "precision mediump float;\n" +context.shaderSource(fShader, "precision highp float;\n" + "varying float " + validAttribName + ";\n" + "void main() {\n" + "gl_FragColor = vec4(" + validAttribName + ", 0.0, 0.0, 1.0); }"); diff --git a/content/canvas/test/webgl/conformance/is-object.html b/content/canvas/test/webgl/conformance/is-object.html index 6231727062cc..390f9b97d024 100644 --- a/content/canvas/test/webgl/conformance/is-object.html +++ b/content/canvas/test/webgl/conformance/is-object.html @@ -1,7 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/methods.html b/content/canvas/test/webgl/conformance/methods.html index 258815e3f9fc..8b6fab6348f9 100644 --- a/content/canvas/test/webgl/conformance/methods.html +++ b/content/canvas/test/webgl/conformance/methods.html @@ -1,12 +1,11 @@ - - + WebGL Methods Test @@ -195,6 +194,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/more-than-65536-points.html b/content/canvas/test/webgl/conformance/more-than-65536-points.html index 35eb53fb6168..52017357ea38 100644 --- a/content/canvas/test/webgl/conformance/more-than-65536-points.html +++ b/content/canvas/test/webgl/conformance/more-than-65536-points.html @@ -1,12 +1,12 @@ - + - WebGL More than 65536 points. @@ -27,7 +27,9 @@ void main() { } diff --git a/content/canvas/test/webgl/conformance/more/conformance/constants.html b/content/canvas/test/webgl/conformance/more/conformance/constants.html index 5ab8389186e5..df3ae870524c 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/constants.html +++ b/content/canvas/test/webgl/conformance/more/conformance/constants.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html b/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html index 959a17181d2b..81b54fb8e9a2 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html +++ b/content/canvas/test/webgl/conformance/more/conformance/fuzzTheAPI.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/getContext.html b/content/canvas/test/webgl/conformance/more/conformance/getContext.html index ab32e9c56356..094cd7311e82 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/getContext.html +++ b/content/canvas/test/webgl/conformance/more/conformance/getContext.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/methods.html b/content/canvas/test/webgl/conformance/more/conformance/methods.html index 085453ae71fe..2b904df1106a 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/methods.html +++ b/content/canvas/test/webgl/conformance/more/conformance/methods.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html index 98adf35ac3e8..f5f2a4aa633d 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html +++ b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPI.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html index f86aadab4e2b..7eae3bdb221a 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/conformance/quickCheckAPIBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html b/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html index 0e41c57cffcf..2b9479c84b67 100644 --- a/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html +++ b/content/canvas/test/webgl/conformance/more/conformance/webGLArrays.html @@ -1,6 +1,6 @@ - + - + @@ -145,8 +145,9 @@ Tests.testThatWritesChangeDrawing = function(gl) { } @@ -249,8 +249,9 @@ window.addEventListener("load", init, false); diff --git a/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html index 80bb7d74ae12..b2feff22d282 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bindBufferBadArgs.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html b/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html index a7fafa80dc40..d65bc7361084 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html +++ b/content/canvas/test/webgl/conformance/more/functions/bindFramebufferLeaveNonZero.html @@ -1,7 +1,7 @@ - + - OpenGL for the web + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferData.html b/content/canvas/test/webgl/conformance/more/functions/bufferData.html index 7946f19e241b..3024b542d345 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferData.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferData.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html index 53fab67adf96..e624f57581de 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferDataBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html b/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html index ccfa7ed38575..8fb0ceb461f3 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferSubData.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html index 2c191e1a4dd4..245b0c3fc3bf 100644 --- a/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/bufferSubDataBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html b/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html index 2138b625dcda..4d191f216df9 100644 --- a/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/copyTexImage2D.html @@ -1,10 +1,9 @@ - + - + @@ -113,8 +113,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html b/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html index 97f78bc33290..f696306d1ef4 100644 --- a/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/copyTexSubImage2D.html @@ -1,10 +1,9 @@ - + - + @@ -125,8 +125,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html index 1569bfb7158e..c04fd6579dae 100644 --- a/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/deleteBufferBadArgs.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/drawArrays.html b/content/canvas/test/webgl/conformance/more/functions/drawArrays.html index f23895dce0f3..20b154fce3f7 100644 --- a/content/canvas/test/webgl/conformance/more/functions/drawArrays.html +++ b/content/canvas/test/webgl/conformance/more/functions/drawArrays.html @@ -1,10 +1,9 @@ - + - + @@ -118,8 +118,9 @@ Tests.testDrawArraysVBOMulti = function(gl, prog, v,n,t) { } @@ -289,8 +289,9 @@ Tests.testDrawArraysOOBShaderJuggle = function(gl, prog, v,n,t) { } @@ -126,8 +126,9 @@ Tests.testDrawElementsVBOMulti = function(gl, prog, v,n,t) { } @@ -192,8 +192,9 @@ Tests.testSharedBuffers = function(gl, prog, v,n,t) { } diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixels.html b/content/canvas/test/webgl/conformance/more/functions/readPixels.html index 1740d8a846d3..4bbf3ef058dc 100644 --- a/content/canvas/test/webgl/conformance/more/functions/readPixels.html +++ b/content/canvas/test/webgl/conformance/more/functions/readPixels.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html index eddb3e03e517..d443878693ca 100644 --- a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html @@ -1,10 +1,9 @@ - + - + @@ -75,16 +75,17 @@ Tests.testReadPixels = function(gl) { new Uint8Array(1*4));}); } +/* this part is obsolete because of bug 656277 + * Tests.testReadPixelsSOPIMG = function(gl) { var img = document.getElementById("i"); while (!img.complete) {} var tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + gl.bindTexture(gl.TEXTURE_2D, null); // SOP failure assertThrowNoGLError(gl, "throw because img is from another domain", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); - gl.bindTexture(gl.TEXTURE_2D, null); - assertOk("canvas still origin-clean", function(){gl.readPixels(0,0,1,1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));}); gl.deleteTexture(tex); @@ -98,15 +99,15 @@ Tests.testReadPixelsSOPCanvas = function(gl) { function(){c.getContext("2d").getImageData(0,0,1,1);}); var tex = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); + gl.bindTexture(gl.TEXTURE_2D, null); // SOP failure assertThrowNoGLError(gl, "throw because canvas is not origin clean", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); - gl.bindTexture(gl.TEXTURE_2D, null); - assertOk("canvas still origin-clean", function(){gl.readPixels(0,0,1,1, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4));}); gl.deleteTexture(tex); } +*/ Tests.endUnit = function(gl) { } diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2D.html b/content/canvas/test/webgl/conformance/more/functions/texImage2D.html index 58bcf239612b..f9827c425cd4 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2D.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html index faf85a6af2de..fd639ffa4f91 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2DBadArgs.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html index fdab1d303058..ebd889ff28d1 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html +++ b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html @@ -1,10 +1,9 @@ - + - + @@ -99,10 +99,8 @@ Tests.testTexImage2DNonSOP = function(gl) { var c = document.getElementById('c'); var ctx = c.getContext('2d'); ctx.drawImage(img,0,0); - assertThrowNoGLError(gl, "texImage2D with cross-origin image should throw exception.", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); - assertThrowNoGLError(gl, "texImage2D with dirty origin canvas should throw exception.", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); } Tests.endUnit = function(gl) { @@ -132,8 +130,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html index 25025faf110b..dfd48fdc1fd1 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2D.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html index c88c788c57c1..ecd8d0a4c504 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DBadArgs.html @@ -1,10 +1,9 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html index ad5108cf4e67..6bac9430846b 100644 --- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html +++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html @@ -1,10 +1,9 @@ - + - + @@ -107,14 +107,10 @@ Tests.testTexImage2DNonSOP = function(gl) { var c = document.getElementById('c'); var ctx = c.getContext('2d'); ctx.drawImage(img,0,0); - assertThrowNoGLError(gl, "texImage2D with cross-origin image should throw exception.", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);}); - assertThrowNoGLError(gl, "texSubImage2D with cross-origin image should throw exception.", - function(){gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, img);}); - assertThrowNoGLError(gl, "texImage2D with dirty origin canvas should throw exception.", - function(){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c);}); - assertThrowNoGLError(gl, "texSubImage2D with dirty origin canvas should throw exception.", - function(){gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, c);}); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, img); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, c); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0,0, gl.RGBA, gl.UNSIGNED_BYTE, c); } Tests.endUnit = function(gl) { @@ -144,8 +140,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html b/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html index 447abb5bc51a..b723b0a77800 100644 --- a/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html +++ b/content/canvas/test/webgl/conformance/more/functions/uniformMatrix.html @@ -1,6 +1,6 @@ - + - + @@ -47,7 +47,9 @@ void main() } @@ -121,7 +121,9 @@ void main() } @@ -52,8 +52,9 @@ void main() } @@ -74,8 +74,9 @@ void main() } @@ -79,8 +79,9 @@ void main() } @@ -52,8 +52,9 @@ void main() } @@ -75,7 +75,9 @@ void main() } @@ -125,8 +125,9 @@ Tests.testVertexAttribVBO = function(gl, prog, v,n,t) { } @@ -101,8 +101,9 @@ Tests.testVertexAttrib = function(gl, prog, v,n,t) { } @@ -89,8 +89,9 @@ Tests.testVertexAttribPointerVBO = function(gl, prog, v,n,t) { } @@ -114,8 +114,9 @@ Tests.testVertexAttribPointerVBO = function(gl, prog, v,n,t) { } @@ -169,8 +169,9 @@ arr.forEach(function(e){ @@ -87,7 +87,9 @@ Tests.testMandelbrot = function(gl) { } @@ -131,8 +131,9 @@ arr.forEach(function(e){ @@ -74,8 +74,9 @@ Tests.testPassingTooManyUniforms = function(gl) { @@ -297,8 +297,9 @@ Tests.gpuGaussianBlur = function(gl) { @@ -168,8 +168,9 @@ Tests.endUnit = function(gl) { diff --git a/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html b/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html index ddb8d77b4dcf..203a9fbc1e25 100644 --- a/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html +++ b/content/canvas/test/webgl/conformance/more/performance/jsMatrixMult.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html b/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html index 9bacc9806999..dbae1b85a8aa 100644 --- a/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html +++ b/content/canvas/test/webgl/conformance/more/performance/jsToGLOverhead.html @@ -1,6 +1,6 @@ - + - + diff --git a/content/canvas/test/webgl/conformance/more/unit.js b/content/canvas/test/webgl/conformance/more/unit.js index 57cdb620fd7a..1396523d3cba 100644 --- a/content/canvas/test/webgl/conformance/more/unit.js +++ b/content/canvas/test/webgl/conformance/more/unit.js @@ -1,7 +1,7 @@ /* Unit testing library for the OpenGL ES 2.0 HTML Canvas context -Copyright (C) 2011 Ilmari Heikkinen +Copyright (C) 2009 Ilmari Heikkinen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/content/canvas/test/webgl/conformance/more/util.js b/content/canvas/test/webgl/conformance/more/util.js index b7ed8904fa73..8d89a5d0467b 100644 --- a/content/canvas/test/webgl/conformance/more/util.js +++ b/content/canvas/test/webgl/conformance/more/util.js @@ -1,7 +1,7 @@ /* Utilities for the OpenGL ES 2.0 HTML Canvas context -Copyright (C) 2011 Ilmari Heikkinen +Copyright (C) 2009 Ilmari Heikkinen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/content/canvas/test/webgl/conformance/null-object-behaviour.html b/content/canvas/test/webgl/conformance/null-object-behaviour.html index 564d2367bd18..1aa25d98841e 100644 --- a/content/canvas/test/webgl/conformance/null-object-behaviour.html +++ b/content/canvas/test/webgl/conformance/null-object-behaviour.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/null-uniform-location.html b/content/canvas/test/webgl/conformance/null-uniform-location.html index 92ab95c856b5..7c75f9fae3fa 100644 --- a/content/canvas/test/webgl/conformance/null-uniform-location.html +++ b/content/canvas/test/webgl/conformance/null-uniform-location.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/object-deletion-behaviour.html b/content/canvas/test/webgl/conformance/object-deletion-behaviour.html index 5f8848ead4db..952bbae14d9c 100644 --- a/content/canvas/test/webgl/conformance/object-deletion-behaviour.html +++ b/content/canvas/test/webgl/conformance/object-deletion-behaviour.html @@ -1,12 +1,10 @@ - - @@ -66,8 +64,7 @@ shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHME shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteTexture(tex)"); // Deleting a texture bound to the currently-bound fbo is the same as // detaching the textue from fbo first, then delete the texture. -shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); -shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); +shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); shouldBeFalse("gl.isTexture(tex)"); shouldBeNull("gl.getParameter(gl.TEXTURE_BINDING_2D)"); shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindTexture(gl.TEXTURE_2D, tex)"); @@ -93,8 +90,7 @@ shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHME shouldGenerateGLError(gl, gl.NO_ERROR, "gl.deleteRenderbuffer(rbo)"); // Deleting a renderbuffer bound to the currently-bound fbo is the same as // detaching the renderbuffer from fbo first, then delete the renderbuffer. -shouldBe("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)", "gl.NONE"); -shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); +shouldBeNull("gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)"); shouldBeFalse("gl.isRenderbuffer(rbo)"); shouldBeNull("gl.getParameter(gl.RENDERBUFFER_BINDING)"); shouldGenerateGLError(gl, gl.NO_ERROR, "gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)"); diff --git a/content/canvas/test/webgl/conformance/oes-standard-derivatives.html b/content/canvas/test/webgl/conformance/oes-standard-derivatives.html index 9f6b75a44cbf..552f74b24a43 100644 --- a/content/canvas/test/webgl/conformance/oes-standard-derivatives.html +++ b/content/canvas/test/webgl/conformance/oes-standard-derivatives.html @@ -3,10 +3,11 @@ Copyright (c) 2011 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - + - + WebGL OES_standard_derivatives Conformance Tests @@ -69,7 +70,7 @@ void main() { + diff --git a/content/canvas/test/webgl/conformance/oes-texture-float.html b/content/canvas/test/webgl/conformance/oes-texture-float.html index 18da6183b85d..9ba3949a24d9 100644 --- a/content/canvas/test/webgl/conformance/oes-texture-float.html +++ b/content/canvas/test/webgl/conformance/oes-texture-float.html @@ -1,12 +1,13 @@ - + - + WebGL OES_texture_float Conformance Tests @@ -83,9 +84,11 @@ if (!gl) { testPassed("No OES_texture_float support -- this is legal"); } else { testPassed("Successfully enabled OES_texture_float extension"); + dump('XXXXXX ' + gl.getExtension("OES_texture_float") + '\n'); runTextureCreationTest(testProgram, true); runRenderTargetTest(testProgram); - runUniqueObjectTest(); + // this sub-test is currently failing, see discussion in bug 630672 + // runUniqueObjectTest(); } } @@ -207,8 +210,6 @@ function runUniqueObjectTest() gl.getExtension("OES_texture_float").myProperty = 2; if (window.GCController) { window.GCController.collect(); - } else if (window.opera && window.opera.collect) { - window.opera.collect(); } else { attemptToForceGC(); } @@ -220,6 +221,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/oes-vertex-array-object.html b/content/canvas/test/webgl/conformance/oes-vertex-array-object.html index 7912dc922b64..e5313f8971a7 100644 --- a/content/canvas/test/webgl/conformance/oes-vertex-array-object.html +++ b/content/canvas/test/webgl/conformance/oes-vertex-array-object.html @@ -3,10 +3,11 @@ Copyright (c) 2011 The Chromium Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> - + - + WebGL OES_vertex_array_object Conformance Tests @@ -392,6 +393,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/origin-clean-conformance.html b/content/canvas/test/webgl/conformance/origin-clean-conformance.html index 04aad3338db1..ada1a30b4b47 100644 --- a/content/canvas/test/webgl/conformance/origin-clean-conformance.html +++ b/content/canvas/test/webgl/conformance/origin-clean-conformance.html @@ -1,12 +1,13 @@ - + - + WebGL Origin Restrictions Conformance Tests @@ -32,32 +33,22 @@ function causedException(func) { try { func(); } catch(e) { + //debug(e); hadException = true; } + //debug ("hadException: " + hadException); return hadException; } window.onload = function() { - description("This test ensures WebGL implementations follow proper same-origin restrictions."); + description("This test ensures WebGL implementations follow proper origin restrictions."); + debug(""); var img = document.getElementById("img"); - assertMsg(img.width > 0 && img.height > 0, "img was loaded"); imgDomain = getBaseDomain(img.src); pageDomain = getBaseDomain(window.location.toString()); assertMsg(imgDomain != pageDomain, "img domain (" + imgDomain + ") and page domain (" + pageDomain + ") are not the same."); - function makeTexImage2D(gl, src) { - return function() { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src); - }; - } - - function makeTexSubImage2D(gl, src) { - return function() { - gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, src); - }; - } - function makeReadPixels(gl) { return function() { var buf = new Uint8Array(4); @@ -71,44 +62,56 @@ window.onload = function() { } } + debug(""); + debug("check that copying an img from another origin clears the origin-clean flag."); var canvas1 = document.getElementById("canvas1"); - var gl = create3DContext(canvas1); + var gl1 = create3DContext(canvas1); + assertMsg(!causedException(makeReadPixels(gl1)), + "should not throw exception by readPixels for origin clean canvas."); + assertMsg(!causedException(makeToDataURL(canvas1)), + "should not throw exception by toDataURL for origin clean canvas."); + + var tex = gl1.createTexture(); + gl1.bindTexture(gl1.TEXTURE_2D, tex); + gl1.texImage2D(gl1.TEXTURE_2D, 0, gl1.RGBA, gl1.RGBA, gl1.UNSIGNED_BYTE, img); + + assertMsg(causedException(makeReadPixels(gl1)), + "should throw exception by readPixels for NON origin clean canvas."); + assertMsg(causedException(makeToDataURL(canvas1)), + "should throw exception by toDataURL for NON origin clean canvas."); debug(""); - debug("check that an attempt to upload an image from another origin throws an exception."); - var tex = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, tex); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 256, 256, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - assertMsg(causedException(makeTexImage2D(gl, img)), - "texImage2D with cross-origin image should throw exception."); - assertMsg(causedException(makeTexSubImage2D(gl, img)), - "texSubImage2D with cross-origin image should throw exception."); - - debug("check that readPixels and toDataURL continue to work against this canvas."); - assertMsg(!causedException(makeReadPixels(gl)), - "readPixels should never throw exception -- not possible to dirty origin of WebGL canvas."); - assertMsg(!causedException(makeToDataURL(canvas1)), - "should not throw exception by toDataURL for WebGL canvas, which should stay origin clean."); - - debug("check that an attempt to upload a tainted canvas throws an exception."); + debug("check that copying from 1 unclean 3d canvas to another clears the origin-clean flag on the second canvas."); var canvas2 = document.getElementById("canvas2"); - var ctx2d = canvas2.getContext("2d"); - ctx2d.drawImage(img, 0, 0); + var gl2 = create3DContext(canvas2); + + assertMsg(!causedException(makeReadPixels(gl2)), + "should not throw exception by readPixels for origin clean canvas."); + assertMsg(!causedException(makeToDataURL(canvas2)), + "should not throw exception by toDataURL for origin clean canvas."); + + var tex = gl2.createTexture(); + gl2.bindTexture(gl2.TEXTURE_2D, tex); + gl2.texImage2D( + gl2.TEXTURE_2D, 0, gl2.RGBA, gl2.RGBA, gl2.UNSIGNED_BYTE, canvas1); + + assertMsg(causedException(makeReadPixels(gl2)), + "should throw exception by readPixels for NON origin clean canvas."); assertMsg(causedException(makeToDataURL(canvas2)), "should throw exception by toDataURL for NON origin clean canvas."); - assertMsg(causedException(makeTexImage2D(gl, canvas2)), - "texImage2D with NON origin clean canvas should throw exception."); - assertMsg(causedException(makeTexSubImage2D(gl, canvas2)), - "texSubImage2D with NON origin clean canvas should throw exception."); - debug("check that readPixels and toDataURL continue to work against this canvas."); - assertMsg(!causedException(makeReadPixels(gl)), - "readPixels should never throw exception -- not possible to dirty origin of WebGL canvas."); - assertMsg(!causedException(makeToDataURL(canvas1)), - "should not throw exception by toDataURL for WebGL canvas, which should stay origin clean."); + debug(""); + debug("check that copying from 1 unclean 3d canvas to a 2d canvas clears the origin-clean flag on the 2d canvas."); + var canvas3 = document.getElementById("canvas3"); + var ctx2d = canvas3.getContext("2d"); + assertMsg(!causedException(makeToDataURL(canvas3)), + "should not throw exception by toDataURL for origin clean canvas."); + ctx2d.drawImage(canvas2, 0, 0); + assertMsg(causedException(makeToDataURL(canvas3)), + "should throw exception by toDataURL for NON origin clean canvas."); - // TODO: Should check video. - // TODO: Should check CORS support. + + // TODO: Should check video? debug(""); successfullyParsed = true; @@ -123,6 +126,7 @@ window.onload = function() {
- + + diff --git a/content/canvas/test/webgl/conformance/point-size.html b/content/canvas/test/webgl/conformance/point-size.html index 28af503b71aa..efc20639a02d 100644 --- a/content/canvas/test/webgl/conformance/point-size.html +++ b/content/canvas/test/webgl/conformance/point-size.html @@ -1,12 +1,10 @@ - - @@ -25,7 +23,9 @@ void main() - - - - -
- - - - - - diff --git a/content/canvas/test/webgl/conformance/program-test.html b/content/canvas/test/webgl/conformance/program-test.html index 665d2b9ac4d9..eb7603b8109a 100644 --- a/content/canvas/test/webgl/conformance/program-test.html +++ b/content/canvas/test/webgl/conformance/program-test.html @@ -1,12 +1,13 @@ - + - + WebGL Program Compiling/Linking Conformance Test @@ -85,14 +86,14 @@ function go() { "bad vertex shader should fail to compile"); var fs = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs); assertMsg(gl.getShaderParameter(fs, gl.COMPILE_STATUS) == true, "good fragment shader should compile"); var fs2 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs2, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }"); + gl.shaderSource(fs2, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor * 0.5; }"); gl.compileShader(fs2); assertMsg(gl.getShaderParameter(fs2, gl.COMPILE_STATUS) == true, @@ -272,7 +273,7 @@ function go() { glErrorShouldBe(gl, gl.NO_ERROR, "The current program shouldn't be deleted"); var fs3 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs3); assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true, @@ -283,7 +284,7 @@ function go() { glErrorShouldBe(gl, gl.INVALID_VALUE, "an unattached shader should be deleted immediately"); fs3 = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fs3, "precision mediump float; varying vec4 vColor; void main() { gl_FragColor = vColor; }"); + gl.shaderSource(fs3, "#ifdef GL_ES\nprecision mediump float;\n#endif\n varying vec4 vColor; void main() { gl_FragColor = vColor; }"); gl.compileShader(fs3); assertMsg(gl.getShaderParameter(fs3, gl.COMPILE_STATUS) == true, diff --git a/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html b/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html index bda059b2eb1a..2035894492ed 100644 --- a/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html +++ b/content/canvas/test/webgl/conformance/read-pixels-pack-alignment.html @@ -1,12 +1,10 @@ - - @@ -23,7 +21,9 @@ void main() @@ -39,7 +39,6 @@ gl.clear(gl.COLOR_BUFFER_BIT); // Resize the canvas to 2x2. This is an attempt to get stuff in the backbuffer. // that shouldn't be there. -canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false); canvas.addEventListener("webglcontextrestored", continueTestAfterContextRestored, false); canvas.width = width; canvas.height = height; diff --git a/content/canvas/test/webgl/conformance/renderbuffer-initialization.html b/content/canvas/test/webgl/conformance/renderbuffer-initialization.html index ceae1ec6a988..40a8922cdb45 100644 --- a/content/canvas/test/webgl/conformance/renderbuffer-initialization.html +++ b/content/canvas/test/webgl/conformance/renderbuffer-initialization.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/resource-sharing-test.html b/content/canvas/test/webgl/conformance/resource-sharing-test.html index a5ff9d883a12..f6e455c017b5 100644 --- a/content/canvas/test/webgl/conformance/resource-sharing-test.html +++ b/content/canvas/test/webgl/conformance/resource-sharing-test.html @@ -1,12 +1,12 @@ - + - WebGL Resource Sharing. @@ -35,7 +35,12 @@ assertMsg( successfullyParsed = true; + + + + diff --git a/content/canvas/test/webgl/conformance/resources/fragmentShader.frag b/content/canvas/test/webgl/conformance/resources/fragmentShader.frag index 08596ed5db12..250d0cf1c917 100644 --- a/content/canvas/test/webgl/conformance/resources/fragmentShader.frag +++ b/content/canvas/test/webgl/conformance/resources/fragmentShader.frag @@ -24,7 +24,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // Workaround for non-compliant WebGL implementations (FIXME) +#if defined(GL_ES) varying mediump vec3 v_normal; +#else +varying vec3 v_normal; +#endif void main() { diff --git a/content/canvas/test/webgl/conformance/resources/npot-video.mp4 b/content/canvas/test/webgl/conformance/resources/npot-video.mp4 deleted file mode 100644 index 59f5f774a783b459385451b4c5df238001cb9f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38215 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 Ly0TFJ+T*_f5*U8o diff --git a/content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm b/content/canvas/test/webgl/conformance/resources/npot-video.webmvp8.webm deleted file mode 100644 index 47277bdaac1f47f803bbe696913a53fa28548f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51240 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 color The color to fill clear with before drawing. A * 4 element array where each element is in the range 0 to 255. * @param {string} msg Message to associate with success. Eg ("should be red"). - * @param {number} errorRange Optional. Acceptable error in - * color checking. 0 by default. */ -var checkCanvas = function(gl, color, msg, errorRange) { - checkCanvasRect(gl, 0, 0, gl.canvas.width, gl.canvas.height, color, msg, errorRange); +var checkCanvas = function(gl, color, msg) { + checkCanvasRect(gl, 0, 0, gl.canvas.width, gl.canvas.height, color, msg); }; /** @@ -620,19 +620,8 @@ var readFileList = function(url) { str[0] != '#' && str[0] != ";" && str.substr(0, 2) != "//") { - var names = str.split(/ +/); - if (names.length == 1) { - new_url = prefix + str; - files = files.concat(readFileList(new_url)); - } else { - var s = ""; - var p = ""; - for (var jj = 0; jj < names.length; ++jj) { - s += p + prefix + names[jj]; - p = " "; - } - files.push(s); - } + new_url = prefix + str; + files = files.concat(readFileList(new_url)); } } } else { @@ -846,29 +835,6 @@ var loadImagesAsync = function(urls, callback) { countDown(); }; -var getUrlArguments = function() { - var args = {}; - try { - var s = window.location.href; - var q = s.indexOf("?"); - var e = s.indexOf("#"); - if (e < 0) { - e = s.length; - } - var query = s.substring(q + 1, e); - var pairs = query.split("&"); - for (var ii = 0; ii < pairs.length; ++ii) { - var keyValue = pairs[ii].split("="); - var key = keyValue[0]; - var value = decodeURIComponent(keyValue[1]); - args[key] = value; - } - } catch (e) { - throw "could not parse url"; - } - return args; -}; - return { create3DContext: create3DContext, create3DContextWithWrapperThatThrowsOnGLError: @@ -879,7 +845,6 @@ return { drawQuad: drawQuad, endsWith: endsWith, getLastError: getLastError, - getUrlArguments: getUrlArguments, glEnumToString: glEnumToString, glErrorShouldBe: glErrorShouldBe, fillTexture: fillTexture, diff --git a/content/canvas/test/webgl/conformance/resources/webgl-test.js b/content/canvas/test/webgl/conformance/resources/webgl-test.js index 4e6b16df60d9..451cb68885ec 100644 --- a/content/canvas/test/webgl/conformance/resources/webgl-test.js +++ b/content/canvas/test/webgl/conformance/resources/webgl-test.js @@ -1,5 +1,5 @@ /* -Copyright (C) 2011 Apple Computer, Inc. All rights reserved. +Copyright (C) 2009 Apple Computer, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -702,7 +702,7 @@ function doLoadImageTexture(ctx, image, texture) { ctx.enable(ctx.TEXTURE_2D); ctx.bindTexture(ctx.TEXTURE_2D, texture); - ctx.texImage2D(ctx.TEXTURE_2D, 0, ctx.RGBA, ctx.RGBA, ctx.UNSIGNED_BYTE, image); + ctx.texImage2D(ctx.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR_MIPMAP_LINEAR); ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE); diff --git a/content/canvas/test/webgl/conformance/shaders/00_test_list.txt b/content/canvas/test/webgl/conformance/shaders/00_test_list.txt deleted file mode 100755 index 4394d1d95fe4..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/00_test_list.txt +++ /dev/null @@ -1,2 +0,0 @@ -glsl-features/00_test_list.txt - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt b/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt deleted file mode 100755 index 28eea83966a3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/00_test_list.txt +++ /dev/null @@ -1,48 +0,0 @@ -../../glsl-features.html?feature=base - -../../glsl-features.html?feature=abs-frag&reffs=shaders/glsl-features/abs-ref.frag&testfs=shaders/glsl-features/abs.frag -../../glsl-features.html?feature=abs-frag-vec2&reffs=shaders/glsl-features/abs-vec2-ref.frag&testfs=shaders/glsl-features/abs-vec2.frag -../../glsl-features.html?feature=abs-frag-vec3&reffs=shaders/glsl-features/abs-vec3-ref.frag&testfs=shaders/glsl-features/abs-vec3.frag -../../glsl-features.html?feature=abs-frag-vec4&reffs=shaders/glsl-features/abs-vec4-ref.frag&testfs=shaders/glsl-features/abs-vec4.frag -../../glsl-features.html?feature=abs-vert&refvs=shaders/glsl-features/abs-ref.vert&testvs=shaders/glsl-features/abs.vert -../../glsl-features.html?feature=abs-vert-vec2&refvs=shaders/glsl-features/abs-vec2-ref.vert&testvs=shaders/glsl-features/abs-vec2.vert -../../glsl-features.html?feature=abs-vert-vec3&refvs=shaders/glsl-features/abs-vec3-ref.vert&testvs=shaders/glsl-features/abs-vec3.vert -../../glsl-features.html?feature=abs-vert-vec4&refvs=shaders/glsl-features/abs-vec4-ref.vert&testvs=shaders/glsl-features/abs-vec4.vert - -../../glsl-features.html?feature=sign-frag&reffs=shaders/glsl-features/sign-ref.frag&testfs=shaders/glsl-features/sign.frag -../../glsl-features.html?feature=sign-frag-vec2&reffs=shaders/glsl-features/sign-vec2-ref.frag&testfs=shaders/glsl-features/sign-vec2.frag -../../glsl-features.html?feature=sign-frag-vec3&reffs=shaders/glsl-features/sign-vec3-ref.frag&testfs=shaders/glsl-features/sign-vec3.frag -../../glsl-features.html?feature=sign-frag-vec4&reffs=shaders/glsl-features/sign-vec4-ref.frag&testfs=shaders/glsl-features/sign-vec4.frag -../../glsl-features.html?feature=sign-vert&refvs=shaders/glsl-features/sign-ref.vert&testvs=shaders/glsl-features/sign.vert -../../glsl-features.html?feature=sign-vert-vec2&refvs=shaders/glsl-features/sign-vec2-ref.vert&testvs=shaders/glsl-features/sign-vec2.vert -../../glsl-features.html?feature=sign-vert-vec3&refvs=shaders/glsl-features/sign-vec3-ref.vert&testvs=shaders/glsl-features/sign-vec3.vert -../../glsl-features.html?feature=sign-vert-vec4&refvs=shaders/glsl-features/sign-vec4-ref.vert&testvs=shaders/glsl-features/sign-vec4.vert - -../../glsl-features.html?feature=floor-frag&reffs=shaders/glsl-features/floor-ref.frag&testfs=shaders/glsl-features/floor.frag -../../glsl-features.html?feature=floor-frag-vec2&reffs=shaders/glsl-features/floor-vec2-ref.frag&testfs=shaders/glsl-features/floor-vec2.frag -../../glsl-features.html?feature=floor-frag-vec3&reffs=shaders/glsl-features/floor-vec3-ref.frag&testfs=shaders/glsl-features/floor-vec3.frag -../../glsl-features.html?feature=floor-frag-vec4&reffs=shaders/glsl-features/floor-vec4-ref.frag&testfs=shaders/glsl-features/floor-vec4.frag -../../glsl-features.html?res=8&feature=floor-vert&refvs=shaders/glsl-features/floor-ref.vert&testvs=shaders/glsl-features/floor.vert -../../glsl-features.html?res=8&feature=floor-vert-vec2&refvs=shaders/glsl-features/floor-vec2-ref.vert&testvs=shaders/glsl-features/floor-vec2.vert -../../glsl-features.html?res=8&feature=floor-vert-vec3&refvs=shaders/glsl-features/floor-vec3-ref.vert&testvs=shaders/glsl-features/floor-vec3.vert -../../glsl-features.html?res=8&feature=floor-vert-vec4&refvs=shaders/glsl-features/floor-vec4-ref.vert&testvs=shaders/glsl-features/floor-vec4.vert - -../../glsl-features.html?feature=ceil-frag&reffs=shaders/glsl-features/ceil-ref.frag&testfs=shaders/glsl-features/ceil.frag -../../glsl-features.html?feature=ceil-frag-vec2&reffs=shaders/glsl-features/ceil-vec2-ref.frag&testfs=shaders/glsl-features/ceil-vec2.frag -../../glsl-features.html?feature=ceil-frag-vec3&reffs=shaders/glsl-features/ceil-vec3-ref.frag&testfs=shaders/glsl-features/ceil-vec3.frag -../../glsl-features.html?feature=ceil-frag-vec4&reffs=shaders/glsl-features/ceil-vec4-ref.frag&testfs=shaders/glsl-features/ceil-vec4.frag -../../glsl-features.html?res=8&feature=ceil-vert&refvs=shaders/glsl-features/ceil-ref.vert&testvs=shaders/glsl-features/ceil.vert -../../glsl-features.html?res=8&feature=ceil-vert-vec2&refvs=shaders/glsl-features/ceil-vec2-ref.vert&testvs=shaders/glsl-features/ceil-vec2.vert -../../glsl-features.html?res=8&feature=ceil-vert-vec3&refvs=shaders/glsl-features/ceil-vec3-ref.vert&testvs=shaders/glsl-features/ceil-vec3.vert -../../glsl-features.html?res=8&feature=ceil-vert-vec4&refvs=shaders/glsl-features/ceil-vec4-ref.vert&testvs=shaders/glsl-features/ceil-vec4.vert - -../../glsl-features.html?feature=fract-frag&reffs=shaders/glsl-features/fract-ref.frag&testfs=shaders/glsl-features/fract.frag -../../glsl-features.html?feature=fract-frag-vec2&reffs=shaders/glsl-features/fract-vec2-ref.frag&testfs=shaders/glsl-features/fract-vec2.frag -../../glsl-features.html?feature=fract-frag-vec3&reffs=shaders/glsl-features/fract-vec3-ref.frag&testfs=shaders/glsl-features/fract-vec3.frag -../../glsl-features.html?feature=fract-frag-vec4&reffs=shaders/glsl-features/fract-vec4-ref.frag&testfs=shaders/glsl-features/fract-vec4.frag -../../glsl-features.html?res=8&feature=fract-vert&refvs=shaders/glsl-features/fract-ref.vert&testvs=shaders/glsl-features/fract.vert -../../glsl-features.html?res=8&feature=fract-vert-vec2&refvs=shaders/glsl-features/fract-vec2-ref.vert&testvs=shaders/glsl-features/fract-vec2.vert -../../glsl-features.html?res=8&feature=fract-vert-vec3&refvs=shaders/glsl-features/fract-vec3-ref.vert&testvs=shaders/glsl-features/fract-vec3.vert -../../glsl-features.html?res=8&feature=fract-vert-vec4&refvs=shaders/glsl-features/fract-vec4-ref.vert&testvs=shaders/glsl-features/fract-vec4.vert - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag deleted file mode 100755 index 4efcd9035f8a..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.frag +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu(float value) { - return value >= 0.0 ? value : -value; -} - -void main() -{ - gl_FragColor = vec4( - abs_emu(vTexcoord.x * 2.0 - 1.0), - abs_emu(vTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert deleted file mode 100755 index 2e618f88b9f3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-ref.vert +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu(float value) { - return value >= 0.0 ? value : -value; -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(color.x * 2.0 - 1.0), - 0, - abs(color.y * 2.0 - 1.0), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag deleted file mode 100755 index 038567f88c8e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.frag +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec2 abs_emu(vec2 value) { - return vec2( - abs_emu1(value.x), - abs_emu1(value.y)); -} - -void main() -{ - gl_FragColor = vec4( - 0, - abs_emu(vColor.xy * 2.0 - vec2(1, 1)), - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert deleted file mode 100755 index 80ea90e6f3ff..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec2 abs_emu(vec2 value) { - return vec2( - abs_emu1(value.x), - abs_emu1(value.y)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(vColor.xy * 2.0 - vec2(1, 1)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag deleted file mode 100755 index 005d2f8207d2..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - 0, - abs(vColor.xy * 2.0 - vec2(1, 1)), - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert deleted file mode 100755 index 818e97d96c9f..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec2.vert +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(vColor.xy * 2.0 - vec2(1, 1)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag deleted file mode 100755 index 826697392042..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.frag +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec3 abs_emu(vec3 value) { - return vec3( - abs_emu1(value.x), - abs_emu1(value.y), - abs_emu1(value.z)); -} - -void main() -{ - gl_FragColor = vec4( - abs_emu(vColor.xyz * 2.0 - vec3(1, 1, 1)), - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert deleted file mode 100755 index 2327acb2ae18..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec3 abs_emu(vec3 value) { - return vec3( - abs_emu1(value.x), - abs_emu1(value.y), - abs_emu1(value.z)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag deleted file mode 100755 index 5b5937278b1e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.frag +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert deleted file mode 100755 index 20fdf67c4f4f..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec3.vert +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(vColor.xyz * 2.0 - vec3(1, 1, 1)), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag deleted file mode 100755 index c8d5146b75f7..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.frag +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec4 abs_emu(vec4 value) { - return vec4( - abs_emu1(value.x), - abs_emu1(value.y), - abs_emu1(value.z), - abs_emu1(value.w)); -} - -void main() -{ - gl_FragColor = abs_emu(vColor * 2.0 - vec4(1, 1, 1, 1)); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert deleted file mode 100755 index 2203c94f352c..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4-ref.vert +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float abs_emu1(float value) { - return value >= 0.0 ? value : -value; -} - -vec4 abs_emu(vec4 value) { - return vec4( - abs_emu1(value.x), - abs_emu1(value.y), - abs_emu1(value.z), - abs_emu1(value.w)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = abs_emu(vColor * 2.0 - vec4(1, 1, 1, 1)); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag deleted file mode 100755 index 155c9dad4e7a..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.frag +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = abs(vColor * 2.0 - vec4(1, 1, 1, 1)); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert deleted file mode 100755 index 2d00173ecac6..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs-vec4.vert +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = abs(vColor * 2.0 - vec4(1, 1, 1, 1)); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag deleted file mode 100755 index 1d18baab19bf..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.frag +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - abs(vTexcoord.x * 2.0 - 1.0), - abs(vTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert deleted file mode 100755 index 4c9a49fc08fa..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/abs.vert +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - abs(color.x * 2.0 - 1.0), - 0, - abs(color.y * 2.0 - 1.0), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag deleted file mode 100755 index 8127ee6fd479..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.frag +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vColor; -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert deleted file mode 100755 index 9acf2add41eb..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/base.vert +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag deleted file mode 100755 index 34e905a9dcd1..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.frag +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -void main() -{ - gl_FragColor = vec4( - ceil_emu(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert deleted file mode 100755 index cf0c76a1cde5..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-ref.vert +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil_emu(color.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag deleted file mode 100755 index ba1904f06581..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.frag +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec2 ceil_emu(vec2 value) { - return vec2( - ceil_emu1(value.x), - ceil_emu1(value.y)); -} - -void main() -{ - gl_FragColor = vec4( - ceil_emu(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert deleted file mode 100755 index 5d6d08ccdd47..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2-ref.vert +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec2 ceil_emu(vec2 value) { - return vec2( - ceil_emu1(value.x), - ceil_emu1(value.y)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag deleted file mode 100755 index 51a3c8be02d9..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - ceil(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert deleted file mode 100755 index 0c665a67c1ae..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec2.vert +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag deleted file mode 100755 index 960694f5451a..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.frag +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec3 ceil_emu(vec3 value) { - return vec3( - ceil_emu1(value.x), - ceil_emu1(value.y), - ceil_emu1(value.z)); -} - -void main() -{ - gl_FragColor = vec4( - ceil_emu(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert deleted file mode 100755 index 2a37961c6d62..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3-ref.vert +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec3 ceil_emu(vec3 value) { - return vec3( - ceil_emu1(value.x), - ceil_emu1(value.y), - ceil_emu1(value.z)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil_emu(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag deleted file mode 100755 index 23d6c439f792..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - ceil(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert deleted file mode 100755 index 9ea299e9c15b..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec3.vert +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag deleted file mode 100755 index 18c360f1c0ec..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.frag +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec4 ceil_emu(vec4 value) { - return vec4( - ceil_emu1(value.x), - ceil_emu1(value.y), - ceil_emu1(value.z), - ceil_emu1(value.w)); -} - -void main() -{ - gl_FragColor = - ceil_emu(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert deleted file mode 100755 index 468a9422e0ca..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4-ref.vert +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float ceil_emu1(float value) { - float m = mod(value, 1.0); - return m != 0.0 ? (value + 1.0 - m) : value; -} - -vec4 ceil_emu(vec4 value) { - return vec4( - ceil_emu1(value.x), - ceil_emu1(value.y), - ceil_emu1(value.z), - ceil_emu1(value.w)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = ceil_emu( - color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag deleted file mode 100755 index aebacfb784f2..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.frag +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = - ceil(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert deleted file mode 100755 index f9053c2babbc..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil-vec4.vert +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = ceil( - color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag deleted file mode 100755 index 827e9056fdce..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - ceil(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert deleted file mode 100755 index ab285b77c391..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/ceil.vert +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - ceil(color.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag deleted file mode 100755 index 90dc7c73c0ed..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.frag +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu(float value) { - return value - mod(value, 1.0); -} - -void main() -{ - gl_FragColor = vec4( - floor_emu(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert deleted file mode 100755 index 1ae5c1d58e4e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-ref.vert +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu(float value) { - return value - mod(value, 1.0); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor_emu(color.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag deleted file mode 100755 index 0b0e762421fa..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.frag +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec2 floor_emu(vec2 value) { - return vec2( - floor_emu1(value.x), - floor_emu1(value.y)); -} - -void main() -{ - gl_FragColor = vec4( - floor_emu(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert deleted file mode 100755 index 27d6e0cbd8ef..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec2 floor_emu(vec2 value) { - return vec2( - floor_emu1(value.x), - floor_emu1(value.y)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag deleted file mode 100755 index 10ce074e7917..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - floor(vColor.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert deleted file mode 100755 index 4e786ad1bf6d..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec2.vert +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor(color.xy * 8.0 - vec2(4, 4)) / 8.0 + vec2(0.5, 0.5), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag deleted file mode 100755 index f2243244726f..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.frag +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec3 floor_emu(vec3 value) { - return vec3( - floor_emu1(value.x), - floor_emu1(value.y), - floor_emu1(value.z)); -} - -void main() -{ - gl_FragColor = vec4( - floor_emu(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert deleted file mode 100755 index f79603a1ab6f..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec3 floor_emu(vec3 value) { - return vec3( - floor_emu1(value.x), - floor_emu1(value.y), - floor_emu1(value.z)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor_emu(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag deleted file mode 100755 index fa1520a3acf3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - floor(vColor.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert deleted file mode 100755 index e6e97a0dd048..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec3.vert +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor(color.xyz * 8.0 - vec3(4, 4, 4)) / 8.0 + vec3(0.5, 0.5, 0.5), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag deleted file mode 100755 index 9769c9d4089e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.frag +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec4 floor_emu(vec4 value) { - return vec4( - floor_emu1(value.x), - floor_emu1(value.y), - floor_emu1(value.z), - floor_emu1(value.w)); -} - -void main() -{ - gl_FragColor = - floor_emu(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert deleted file mode 100755 index 12b3612a315e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float floor_emu1(float value) { - return value - mod(value, 1.0); -} - -vec4 floor_emu(vec4 value) { - return vec4( - floor_emu1(value.x), - floor_emu1(value.y), - floor_emu1(value.z), - floor_emu1(value.w)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = floor_emu( - color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag deleted file mode 100755 index bf75bcfbfe44..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.frag +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = - floor(vColor * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert deleted file mode 100755 index 81bef611bf52..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor-vec4.vert +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = floor( - color * 8.0 - vec4(4, 4, 4, 4)) / 8.0 + vec4(0.5, 0.5, 0.5, 0.5); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag deleted file mode 100755 index 8010c3bd3eb1..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - floor(vColor.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert deleted file mode 100755 index 570c11d06f01..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/floor.vert +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - floor(color.x * 8.0 - 4.0) / 8.0 + 0.5, - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag deleted file mode 100755 index 67918fc30753..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.frag +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu(float value) { - return value - floor(value); -} - -void main() -{ - gl_FragColor = vec4( - fract_emu(vColor.x * 4.0 - 2.0), - 0, 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert deleted file mode 100755 index 8a071474b76d..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-ref.vert +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu(float value) { - return value - floor(value); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract_emu(color.x * 4.0 - 2.0), - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag deleted file mode 100755 index 6fea00d39084..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.frag +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec2 fract_emu(vec2 value) { - return vec2( - fract_emu1(value.x), - fract_emu1(value.y)); -} - -void main() -{ - gl_FragColor = vec4( - fract_emu(vColor.xy * 4.0 - vec2(2, 2)), - 0, 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert deleted file mode 100755 index 0fada9b803bc..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec2 fract_emu(vec2 value) { - return vec2( - fract_emu1(value.x), - fract_emu1(value.y)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract(color.xy * 4.0 - vec2(2, 2)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag deleted file mode 100755 index 6806ca5a64c2..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - fract(vColor.xy * 4.0 - vec2(2, 2)), - 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert deleted file mode 100755 index 5156b38f5625..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec2.vert +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract(color.xy * 4.0 - vec2(2, 2)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag deleted file mode 100755 index e09fac3ea28f..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.frag +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec3 fract_emu(vec3 value) { - return vec3( - fract_emu1(value.x), - fract_emu1(value.y), - fract_emu1(value.z)); -} - -void main() -{ - gl_FragColor = vec4( - fract_emu(vColor.xyz * 4.0 - vec3(2, 2, 2)), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert deleted file mode 100755 index fc1ab9530d25..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3-ref.vert +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec3 fract_emu(vec3 value) { - return vec3( - fract_emu1(value.x), - fract_emu1(value.y), - fract_emu1(value.z)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract_emu(color.xyz * 4.0 - vec3(2, 2, 2)), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag deleted file mode 100755 index d9b3bc4ce1f4..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - fract(vColor.xyz * 4.0 - vec3(2, 2, 2)), - 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert deleted file mode 100755 index 12c1e02975d8..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec3.vert +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract(color.xyz * 4.0 - vec3(2, 2, 2)), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag deleted file mode 100755 index 4c6b45ac50d6..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.frag +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec4 fract_emu(vec4 value) { - return vec4( - fract_emu1(value.x), - fract_emu1(value.y), - fract_emu1(value.z), - fract_emu1(value.w)); -} - -void main() -{ - gl_FragColor = - fract_emu(vColor * 4.0 - vec4(2, 2, 2, 2)); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert deleted file mode 100755 index 69f50557f3c0..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4-ref.vert +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float fract_emu1(float value) { - return value - floor(value); -} - -vec4 fract_emu(vec4 value) { - return vec4( - fract_emu1(value.x), - fract_emu1(value.y), - fract_emu1(value.z), - fract_emu1(value.w)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = fract_emu(color * 4.0 - vec4(2, 2, 2, 2)); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag deleted file mode 100755 index b46769b244c3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.frag +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = fract(vColor * 4.0 - vec4(2, 2, 2, 2)); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert deleted file mode 100755 index 4e6fd1855346..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract-vec4.vert +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = fract(color * 4.0 - vec4(2, 2, 2, 2)); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag deleted file mode 100755 index d7f14af047fc..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - fract(vColor.x * 4.0 - 2.0), - 0, 0, 1); -} - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert deleted file mode 100755 index 04949277f174..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/fract.vert +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vec4 color = vec4( - aTexcoord, - aTexcoord.x * aTexcoord.y, - (1.0 - aTexcoord.x) * aTexcoord.y * 0.5 + 0.5); - vColor = vec4( - fract(color.x * 4.0 - 2.0), - 0, - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag deleted file mode 100755 index 305993926348..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.frag +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -void main() -{ - gl_FragColor = vec4( - sign_emu(vTexcoord.x * 2.0 - 1.0), - sign_emu(vTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert deleted file mode 100755 index f8fd8dd74d9e..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-ref.vert +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign_emu(aTexcoord.x * 2.0 - 1.0), - sign_emu(aTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag deleted file mode 100755 index 682abf2b08c3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.frag +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec2 sign_emu(vec2 value) { - return vec2( - sign_emu1(value.x), - sign_emu1(value.y)); -} - -void main() -{ - gl_FragColor = vec4(sign_emu( - vTexcoord * 2.0 - vec2(1, 1)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert deleted file mode 100755 index c332114eb6d3..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2-ref.vert +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec2 sign_emu(vec2 value) { - return vec2(sign_emu1(value.x), sign_emu1(value.y)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign_emu(aTexcoord * 2.0 - vec2(1, 1)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag deleted file mode 100755 index 24fc3786cb94..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4(sign( - vTexcoord * 2.0 - vec2(1, 1)), - 0, - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert deleted file mode 100755 index 3bab936c7020..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec2.vert +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign(aTexcoord * 2.0 - vec2(1, 1)), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag deleted file mode 100755 index 1f9689f05e27..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.frag +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec3 sign_emu(vec3 value) { - return vec3( - sign_emu1(value.x), - sign_emu1(value.y), - sign_emu1(value.z)); -} - -void main() -{ - gl_FragColor = vec4(sign_emu(vec3( - 0, - vTexcoord * 2.0 - vec2(1, 1))), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert deleted file mode 100755 index cb5ea493ddd2..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3-ref.vert +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec3 sign_emu(vec3 value) { - return vec3(sign_emu1(value.x), sign_emu1(value.y), sign_emu1(value.z)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign_emu(vec3(0, aTexcoord * 2.0 - vec2(1, 1))), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag deleted file mode 100755 index 06681aae0980..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.frag +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4(sign(vec3( - 0, - vTexcoord * 2.0 - vec2(1, 1))), - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert deleted file mode 100755 index a37660e5b10b..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec3.vert +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign(vec3(0, aTexcoord * 2.0 - vec2(1, 1))), - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag deleted file mode 100755 index 27b6bdb5f583..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.frag +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec4 sign_emu(vec4 value) { - return vec4( - sign_emu1(value.x), - sign_emu1(value.y), - sign_emu1(value.z), - sign_emu1(value.w)); -} - -void main() -{ - gl_FragColor = sign_emu(vec4( - vTexcoord.yx * -2.0 + vec2(1, 1), - vTexcoord * 2.0 - vec2(1, 1))); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert deleted file mode 100755 index 80fcad195970..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4-ref.vert +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -float sign_emu1(float value) { - if (value == 0.0) return 0.0; - return value > 0.0 ? 1.0 : -1.0; -} - -vec4 sign_emu(vec4 value) { - return vec4( - sign_emu1(value.x), - sign_emu1(value.y), - sign_emu1(value.z), - sign_emu1(value.w)); -} - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = sign_emu(vec4( - aTexcoord.yx * -2.0 + vec2(1, 1), - aTexcoord * 2.0 - vec2(1, 1))); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag deleted file mode 100755 index 07804592ee2a..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.frag +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = sign(vec4( - vTexcoord.yx * -2.0 + vec2(1, 1), - vTexcoord * 2.0 - vec2(1, 1))); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert deleted file mode 100755 index 7165ae3ef943..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign-vec4.vert +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = sign(vec4( - aTexcoord.yx * -2.0 + vec2(1, 1), - aTexcoord * 2.0 - vec2(1, 1))); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag deleted file mode 100755 index 6ead9a068612..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.frag +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -precision mediump float; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_FragColor = vec4( - sign(vTexcoord.x * 2.0 - 1.0), - sign(vTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - diff --git a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert b/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert deleted file mode 100755 index 6be8b9d4b8c9..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/glsl-features/sign.vert +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -attribute vec4 aPosition; -attribute vec2 aTexcoord; - -varying vec2 vTexcoord; -varying vec4 vColor; - -void main() -{ - gl_Position = aPosition; - vTexcoord = aTexcoord; - vColor = vec4( - sign(aTexcoord.x * 2.0 - 1.0), - sign(aTexcoord.y * 2.0 - 1.0), - 0, - 1); -} - - - - diff --git a/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt b/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt index 1fd1c5c6e583..3bcf92e5ba47 100644 --- a/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt +++ b/content/canvas/test/webgl/conformance/shaders/misc/00_shaders.txt @@ -1,5 +1,3 @@ non-ascii.vert non-ascii-comments.vert -shared.vert shared-a.frag -shared.vert shared-b.frag diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag b/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag deleted file mode 100755 index 73ca3c8a0992..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/misc/shared-a.frag +++ /dev/null @@ -1,34 +0,0 @@ -// shared fragment shader should succeed. -precision mediump float; -uniform vec4 lightColor; -varying vec4 v_position; -varying vec2 v_texCoord; -varying vec3 v_surfaceToLight; - -uniform vec4 ambient; -uniform sampler2D diffuse; -uniform vec4 specular; -uniform float shininess; -uniform float specularFactor; -// #fogUniforms - -vec4 lit(float l ,float h, float m) { - return vec4(1.0, - max(l, 0.0), - (l > 0.0) ? pow(max(0.0, h), m) : 0.0, - 1.0); -} -void main() { - vec4 diffuseColor = texture2D(diffuse, v_texCoord); - vec4 normalSpec = vec4(0,0,0,0); // #noNormalMap - vec3 surfaceToLight = normalize(v_surfaceToLight); - vec3 halfVector = normalize(surfaceToLight); - vec4 litR = lit(1.0, 1.0, shininess); - vec4 outColor = vec4( - (lightColor * (diffuseColor * litR.y + diffuseColor * ambient + - specular * litR.z * specularFactor * normalSpec.a)).rgb, - diffuseColor.a); - // #fogCode - gl_FragColor = outColor; -} - diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag b/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag deleted file mode 100755 index 77b4a76d7a9c..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/misc/shared-b.frag +++ /dev/null @@ -1,31 +0,0 @@ -// shared fragment shader should succeed. -precision mediump float; -varying vec4 v_position; -varying vec2 v_texCoord; -varying vec3 v_surfaceToLight; - -// #fogUniforms - -vec4 lit(float l ,float h, float m) { - return vec4(1.0, - max(l, 0.0), - (l > 0.0) ? pow(max(0.0, h), m) : 0.0, - 1.0); -} -void main() { - vec4 normalSpec = vec4(0,0,0,0); // #noNormalMap - vec4 reflection = vec4(0,0,0,0); // #noReflection - vec3 surfaceToLight = normalize(v_surfaceToLight); - vec4 skyColor = vec4(0.5,0.5,1,1); // #noReflection - - vec3 halfVector = normalize(surfaceToLight); - vec4 litR = lit(1.0, 1.0, 10.0); - vec4 outColor = vec4(mix( - skyColor, - vec4(1,2,3,4) * (litR.y + litR.z * normalSpec.a), - 1.0 - reflection.r).rgb, - 1.0); - // #fogCode - gl_FragColor = outColor; -} - diff --git a/content/canvas/test/webgl/conformance/shaders/misc/shared.vert b/content/canvas/test/webgl/conformance/shaders/misc/shared.vert deleted file mode 100755 index 0acfbd2975c6..000000000000 --- a/content/canvas/test/webgl/conformance/shaders/misc/shared.vert +++ /dev/null @@ -1,41 +0,0 @@ -// shared vertex shader should succeed. -uniform mat4 viewProjection; -uniform vec3 worldPosition; -uniform vec3 nextPosition; -uniform float fishLength; -uniform float fishWaveLength; -uniform float fishBendAmount; -attribute vec4 position; -attribute vec2 texCoord; -varying vec4 v_position; -varying vec2 v_texCoord; -varying vec3 v_surfaceToLight; -void main() { - vec3 vz = normalize(worldPosition - nextPosition); - vec3 vx = normalize(cross(vec3(0,1,0), vz)); - vec3 vy = cross(vz, vx); - mat4 orientMat = mat4( - vec4(vx, 0), - vec4(vy, 0), - vec4(vz, 0), - vec4(worldPosition, 1)); - mat4 world = orientMat; - mat4 worldViewProjection = viewProjection * world; - mat4 worldInverseTranspose = world; - - v_texCoord = texCoord; - // NOTE:If you change this you need to change the laser code to match! - float mult = position.z > 0.0 ? - (position.z / fishLength) : - (-position.z / fishLength * 2.0); - float s = sin(mult * fishWaveLength); - float a = sign(s); - float offset = pow(mult, 2.0) * s * fishBendAmount; - v_position = ( - worldViewProjection * - (position + - vec4(offset, 0, 0, 0))); - v_surfaceToLight = (world * position).xyz; - gl_Position = v_position; -} - diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html index acf9ef605573..5c3c5f021d43 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-array-buffer-view.html @@ -1,12 +1,10 @@ - - @@ -186,7 +184,6 @@ gl.clearDepth(1); textureLoc = gl.getUniformLocation(program, "tex"); runTest(); -glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); successfullyParsed = true; diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html deleted file mode 100644 index ba22f1334c8f..000000000000 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-canvas.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - -
-
- - - - diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html index bc39b1cc0837..0fba1a09bd3d 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image-data.html @@ -1,12 +1,10 @@ - - @@ -124,7 +122,6 @@ function runTest() runOneIteration(true, false, true, greenPremultiplyAlpha, redPremultiplyAlpha); - glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html index 0b9d73dfd870..7d9b7b62e9df 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-image.html @@ -1,12 +1,10 @@ - - @@ -16,7 +14,6 @@ var wtu = WebGLTestUtils; var gl = null; var textureLoc = null; var successfullyParsed = false; -var imgCanvas; function init() { @@ -33,7 +30,7 @@ function init() gl.clearColor(0,0,0,1); gl.clearDepth(1); - textureLoc = gl.getUniformLocation(program, "tex"); + textureLoc = gl.getUniformLocation(gl.program, "tex"); wtu.loadTexture(gl, "resources/red-green.png", runTest); } @@ -85,47 +82,15 @@ function runOneIteration(image, useTexSubImage2D, flipY, topColor, bottomColor) "shouldBe " + topColor); } -function runTestOnImage(image) { +function runTest(image) +{ var red = [255, 0, 0]; var green = [0, 255, 0]; runOneIteration(image, false, true, red, green); runOneIteration(image, false, false, green, red); runOneIteration(image, true, true, red, green); runOneIteration(image, true, false, green, red); -} -function runTest(image) -{ - runTestOnImage(image); - - imgCanvas = document.createElement("canvas"); - imgCanvas.width = 1; - imgCanvas.height = 2; - var imgCtx = imgCanvas.getContext("2d"); - imgCtx.drawImage(image, 0, 0); - - // apparently Image is different than . - var newImage = new Image(); - newImage.onload = function() { - runTest2(newImage); - }; - newImage.src = imgCanvas.toDataURL(); -} - -function runTest2(image) { - runTestOnImage(image); - - var newImage = document.createElement("img"); - newImage.onload = function() { - runTest3(newImage); - }; - newImage.src = imgCanvas.toDataURL(); -} - -function runTest3(image) { - runTestOnImage(image); - - glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html index 968f9b7c93b8..c87ffc172e6a 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-sub-image-2d-with-video.html @@ -1,12 +1,10 @@ - - @@ -32,12 +30,11 @@ function init() gl.clearColor(0,0,0,1); gl.clearDepth(1); - textureLoc = gl.getUniformLocation(program, "tex"); + textureLoc = gl.getUniformLocation(gl.program, "tex"); var video = document.getElementById("vid"); video.addEventListener( "playing", function() { runTest(video); }, true); - video.loop = true; video.play(); } @@ -107,7 +104,6 @@ function runTest(videoElement) runOneIteration(videoElement, true, true, red, green); runOneIteration(videoElement, true, false, green, red); - glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors"); finishTest(); } diff --git a/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html b/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html index 6b4491a547f3..c50ef343f34a 100644 --- a/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html +++ b/content/canvas/test/webgl/conformance/tex-image-and-uniform-binding-bugs.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html b/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html index bbd2fe216290..8f56a3d80e5d 100644 --- a/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html +++ b/content/canvas/test/webgl/conformance/tex-image-with-format-and-type.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html b/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html index bbfaea6cf587..ebe1c7c317e5 100644 --- a/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html +++ b/content/canvas/test/webgl/conformance/tex-image-with-invalid-data.html @@ -1,8 +1,8 @@ - + - - texImage2D and texSubImage2D tests with invalid data + + texImage2D and texSubImage2D tests with invalid data @@ -95,6 +95,8 @@ debug(""); successfullyParsed = true; + diff --git a/content/canvas/test/webgl/conformance/tex-input-validation.html b/content/canvas/test/webgl/conformance/tex-input-validation.html index be03d24ea475..1ec16031f209 100644 --- a/content/canvas/test/webgl/conformance/tex-input-validation.html +++ b/content/canvas/test/webgl/conformance/tex-input-validation.html @@ -1,12 +1,10 @@ - - diff --git a/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html b/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html index 7b67cad5a33c..d197777844e9 100644 --- a/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html +++ b/content/canvas/test/webgl/conformance/tex-sub-image-2d-bad-args.html @@ -1,7 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/tex-sub-image-2d.html b/content/canvas/test/webgl/conformance/tex-sub-image-2d.html index f7058265f1f4..8bef5fcebbc9 100644 --- a/content/canvas/test/webgl/conformance/tex-sub-image-2d.html +++ b/content/canvas/test/webgl/conformance/tex-sub-image-2d.html @@ -1,19 +1,18 @@ - - @@ -30,8 +30,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/texture-active-bind-2.html b/content/canvas/test/webgl/conformance/texture-active-bind-2.html index 3ae2e4b37592..b7e15acc060c 100644 --- a/content/canvas/test/webgl/conformance/texture-active-bind-2.html +++ b/content/canvas/test/webgl/conformance/texture-active-bind-2.html @@ -1,12 +1,12 @@ - + - WebGL ActiveTexture BindTexture conformance test #2 @@ -29,8 +29,9 @@ void main() } diff --git a/content/canvas/test/webgl/conformance/texture-complete.html b/content/canvas/test/webgl/conformance/texture-complete.html index 365e10fd986c..0b4b3c748bb9 100644 --- a/content/canvas/test/webgl/conformance/texture-complete.html +++ b/content/canvas/test/webgl/conformance/texture-complete.html @@ -1,12 +1,12 @@ - + - WebGL "Texture Complete" texture conformance test. diff --git a/content/canvas/test/webgl/conformance/texture-formats-test.html b/content/canvas/test/webgl/conformance/texture-formats-test.html index 724913370ea6..aba54bd2f8a6 100644 --- a/content/canvas/test/webgl/conformance/texture-formats-test.html +++ b/content/canvas/test/webgl/conformance/texture-formats-test.html @@ -1,12 +1,13 @@ - + - + WebGL Texture Format Conformance Tests @@ -247,5 +248,8 @@ successfullyParsed = true; + + diff --git a/content/canvas/test/webgl/conformance/texture-npot-video.html b/content/canvas/test/webgl/conformance/texture-npot-video.html deleted file mode 100644 index 0ad894b2f97d..000000000000 --- a/content/canvas/test/webgl/conformance/texture-npot-video.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - -
-
- - - diff --git a/content/canvas/test/webgl/conformance/texture-npot.html b/content/canvas/test/webgl/conformance/texture-npot.html index b81163827b68..146bda44d3f2 100644 --- a/content/canvas/test/webgl/conformance/texture-npot.html +++ b/content/canvas/test/webgl/conformance/texture-npot.html @@ -1,12 +1,12 @@ - + - WebGL Non-Power of 2 texture conformance test. @@ -29,7 +29,9 @@ void main() + + + diff --git a/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html b/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html index f8a3c2aa642d..fb9733273d4b 100644 --- a/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html +++ b/content/canvas/test/webgl/conformance/texture-transparent-pixels-initialized.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/triangle.html b/content/canvas/test/webgl/conformance/triangle.html index 1e4550b49898..5637b42960f3 100644 --- a/content/canvas/test/webgl/conformance/triangle.html +++ b/content/canvas/test/webgl/conformance/triangle.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/uniform-location.html b/content/canvas/test/webgl/conformance/uniform-location.html index 343d42a76fae..802249aadb6b 100644 --- a/content/canvas/test/webgl/conformance/uniform-location.html +++ b/content/canvas/test/webgl/conformance/uniform-location.html @@ -1,5 +1,5 @@ - - diff --git a/content/canvas/test/webgl/conformance/uniform-samplers-test.html b/content/canvas/test/webgl/conformance/uniform-samplers-test.html index d43005a7303b..fe26e1d7e2a4 100644 --- a/content/canvas/test/webgl/conformance/uniform-samplers-test.html +++ b/content/canvas/test/webgl/conformance/uniform-samplers-test.html @@ -1,12 +1,12 @@ - + - WebGL sampler uniforms conformance test. @@ -55,7 +55,12 @@ function init() init(); successfullyParsed = true; + + + + diff --git a/content/canvas/test/webgl/conformance/uninitialized-test.html b/content/canvas/test/webgl/conformance/uninitialized-test.html index fee8628a09b3..38accd463b42 100644 --- a/content/canvas/test/webgl/conformance/uninitialized-test.html +++ b/content/canvas/test/webgl/conformance/uninitialized-test.html @@ -1,7 +1,7 @@ - + - + WebGL Uninitialized GL Resources Tests diff --git a/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html b/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html index 5af19fc3d273..a88ba9250f6e 100644 --- a/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html +++ b/content/canvas/test/webgl/conformance/viewport-unchanged-upon-resize.html @@ -1,11 +1,10 @@ - diff --git a/content/canvas/test/webgl/conformance/webgl-specific.html b/content/canvas/test/webgl/conformance/webgl-specific.html index 53e2ea0feabe..61a1f846f44d 100644 --- a/content/canvas/test/webgl/conformance/webgl-specific.html +++ b/content/canvas/test/webgl/conformance/webgl-specific.html @@ -1,12 +1,12 @@ - + - WebGL GLES2 difference test. @@ -92,10 +92,6 @@ gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE); shouldBe("gl.getParameter(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL)", "gl.NONE"); glErrorShouldBe(gl, gl.NO_ERROR, "set/get UNPACK_COLORSPACE_CONVERSION_WEBGL should generate no error"); -debug(""); -debug("Verify that drawingBufferWidth and drawingBufferHeights are implemented"); -shouldBeTrue("gl.drawingBufferWidth >= 0 && gl.drawingBufferHeight >= 0"); - successfullyParsed = true; diff --git a/content/canvas/test/webgl/delete-quickCheckAPI.patch b/content/canvas/test/webgl/delete-quickCheckAPI.patch new file mode 100644 index 000000000000..11391ed25776 --- /dev/null +++ b/content/canvas/test/webgl/delete-quickCheckAPI.patch @@ -0,0 +1,19 @@ +# HG changeset patch +# Parent 0d4172be40b03cc4dbe704244623174363cec0bf +diff --git a/content/canvas/test/webgl/conformance/more/00_test_list.txt b/content/canvas/test/webgl/conformance/more/00_test_list.txt +--- a/content/canvas/test/webgl/conformance/more/00_test_list.txt ++++ b/content/canvas/test/webgl/conformance/more/00_test_list.txt +@@ -1,12 +1,12 @@ + conformance/constants.html + conformance/getContext.html + conformance/methods.html +-conformance/quickCheckAPI.html ++#conformance/quickCheckAPI.html + conformance/webGLArrays.html + functions/bindBuffer.html + functions/bindBufferBadArgs.html + functions/bindFramebufferLeaveNonZero.html + functions/bufferData.html + functions/bufferDataBadArgs.html + functions/bufferSubData.html + functions/bufferSubDataBadArgs.html diff --git a/content/canvas/test/webgl/disable-gl-min-textures.patch b/content/canvas/test/webgl/disable-gl-min-textures.patch new file mode 100644 index 000000000000..1246c579ef37 --- /dev/null +++ b/content/canvas/test/webgl/disable-gl-min-textures.patch @@ -0,0 +1,24 @@ +# HG changeset patch +# Parent 59a9fa08e7308ecc5942f76387340dd209bcc644 +diff --git a/content/canvas/test/webgl/conformance/00_test_list.txt b/content/canvas/test/webgl/conformance/00_test_list.txt +--- a/content/canvas/test/webgl/conformance/00_test_list.txt ++++ b/content/canvas/test/webgl/conformance/00_test_list.txt +@@ -25,17 +25,17 @@ gl-enable-enum-test.html + gl-enable-vertex-attrib.html + gl-enum-tests.html + gl-get-active-attribute.html + gl-get-active-uniform.html + gl-get-calls.html + gl-getshadersource.html + gl-getstring.html + gl-min-attribs.html +-gl-min-textures.html ++# gl-min-textures.html + gl-min-uniforms.html + gl-object-get-calls.html + gl-pixelstorei.html + gl-scissor-test.html + gl-shader-test.html + gl-teximage.html + gl-uniform-arrays.html + gl-uniform-bool.html diff --git a/content/canvas/test/webgl/dont-load-image-from-internet.patch b/content/canvas/test/webgl/dont-load-image-from-internet.patch index 0216e7b070df..1e1ac29fcf43 100644 --- a/content/canvas/test/webgl/dont-load-image-from-internet.patch +++ b/content/canvas/test/webgl/dont-load-image-from-internet.patch @@ -1,9 +1,7 @@ -# HG changeset patch -# Parent 1b98fb9a1e88ae0fba1453489fb12aa2cda47481 -diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html ---- a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html -+++ b/content/canvas/test/webgl/conformance/more/functions/readPixelsBadArgs.html -@@ -110,10 +110,10 @@ Tests.testReadPixelsSOPCanvas = function +diff --git a/conformance/more/functions/readPixelsBadArgs.html b/conformance/more/functions/readPixelsBadArgs.html +--- a/conformance/more/functions/readPixelsBadArgs.html ++++ b/conformance/more/functions/readPixelsBadArgs.html +@@ -108,10 +108,10 @@ Tests.testReadPixelsSOPCanvas = function Tests.endUnit = function(gl) { } @@ -15,43 +13,10 @@ diff --git a/content/canvas/test/webgl/conformance/more/functions/readPixelsBadA - + -diff --git a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html ---- a/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html -+++ b/content/canvas/test/webgl/conformance/more/functions/texImage2DHTML.html -@@ -142,11 +142,11 @@ void main() - vec4 c = texture2D(Texture, texCoord0.st); - gl_FragColor = c; - } - - - - - -- -+ - - -diff --git a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html ---- a/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html -+++ b/content/canvas/test/webgl/conformance/more/functions/texSubImage2DHTML.html -@@ -154,11 +154,11 @@ void main() - vec4 c = texture2D(Texture, texCoord0.st); - gl_FragColor = c; - } - - - - - -- -+ - - -diff --git a/content/canvas/test/webgl/conformance/origin-clean-conformance.html b/content/canvas/test/webgl/conformance/origin-clean-conformance.html ---- a/content/canvas/test/webgl/conformance/origin-clean-conformance.html -+++ b/content/canvas/test/webgl/conformance/origin-clean-conformance.html -@@ -118,11 +118,11 @@ window.onload = function() { - } +diff --git a/conformance/origin-clean-conformance.html b/conformance/origin-clean-conformance.html +--- a/conformance/origin-clean-conformance.html ++++ b/conformance/origin-clean-conformance.html +@@ -122,11 +122,11 @@ window.onload = function() { @@ -59,11 +24,12 @@ diff --git a/content/canvas/test/webgl/conformance/origin-clean-conformance.html
-- -+ + +- ++ -diff --git a/content/canvas/test/webgl/resources/opengl_logo.jpg b/content/canvas/test/webgl/resources/opengl_logo.jpg +diff --git a/resources/opengl_logo.jpg b/resources/opengl_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3b70bef3f2c78736c72e263b63acea8d9a9467a GIT binary patch @@ -180,1237 +146,3 @@ z=iUN*6P526MKx5(vuDYuK<94#%&o^t6+xl8o=z}hPU9RN<*>do6PDn#f)9kB0;Q;! zfYcVwLp^QywE1HHD8c{Rm?Wo&8P70Va(zMpZ`|| I?(NKf0MJeN7XSbN -diff --git a/content/canvas/test/webgl/resources/thunderbird-logo-64x64.png b/content/canvas/test/webgl/resources/thunderbird-logo-64x64.png -new file mode 100644 -index 0000000000000000000000000000000000000000..e2326f5510a0d2f89601c62459032be9d64585da -GIT binary patch -literal 63843 -zc$|!OWm6nX*Yx7<4vV{Mkl-4e0KwfMxI2q$aCZxm;1VF%BEey?1b25^U~!)7uJ;eT -zAEu^irsqu0sWYcL?z8$QEOc^o004lcq$sBa0KftMH&BuPn~XiGZ2^EsHYGXfFMca$ -z!6*eLHo0$}F2$yNj6Fj5bJeMAL-64&4`y%_jU8-0QR}}r^@+WmOX@pny5c)&;>%h? -zaTTkT6fbib<^#L<+uJ=M@4=gw1)kGAxo8~;m^QsHE*FJH>aQDz!5dEwIly!)k8XC9Nn_W@ROx{K?NIos!uRdv0A08Ke*g`onm4|Z*Mql3 -z>h0%+qc)3lxew|$srghnN4t5zhV}nJ!ZdF--aGIseTaI3s@9qcu>HE*>ApM_?lo*m -z^39G2iI{d-;R8%7%AaK4*8zjwvpkdenDdcJ?c)LfelY+hRzcy~)2kiR6DjkEBj~@& -zYn%j3VKvD12UDFc8-13pE1Q>*`h?I+)kTzk!P -zhU*xhG*cQo8swX&QB;ZaJ&qK7&mcib1W&C8=8*|OCb%sf9^#Obix$=S?(E23%_9k= -z-qLwc2zB#dxuV#+fMwnLyyE4p#%+^&(&AzcVkjEbgaoW>)obuU;52aIrP4lxI7D(z -z+(ND>2!6IV&~{F*i|I-KKOV0C@jy)c_wIEmh7TQ4I-MrzoHpDPhTVi1Am1UrZ-5&$#4&}?h8 -zVU@jakKj@E`l6*clDmrXOZbpDk385^wzP=x&pehMWl_I>Et_`s=x!Tk0CW%RP8wZ+ -zmw6J6fJViU8$2Hrzj1HLHVcIpJyVS+zFXNLtXoAt*_yyMu{N610(g9cKNl=&IE3S2(2Ca-uEC7=joFslQp4Zwl;_O>p@j??c#>&}h -zmihfq`60-cB074svW|59<>-#=?5W}ZMFIXVN@DxlYUiQS!{UI)Jy}+ZM)#`(4qqHc -z(p!MI!m8PWKX$&P*n(gd=%QVcU##dFUi2{xNc!y9wT! -zCJitUw6n#c*Q-0k9i6>C`lH|>VggWpgEajpqqid^n-|#mU8~SA^`LDQGNQ7vxaa4c -zqy%`NNKWW|R{S+mE-r5vBHz@aA^#+P^K>OXZD9^OkTnqNZS|vI4my(@56}FikxMnL -zboDR;J7U6g4!&hJaC#TM8Q>lehNb(4H2Q+H?Y_Q(ebfuz7ILYd#=w!KkJ(aCPFld% -z88uI;Fi4QUbIylO7b#}BIfI#FVY#hi@xcI%w*za2kn^Xa`qP(>s>MUcqMWy;#YOy2 -zW8KG-`wy<=>5!I+yUk6>XV1xoN4jPUgT_m$tGcP}sec398`g7WWAIbPe=HE>)< -zlk3%{g#D&>M{SafGy4}dJ3-)k4Bz4-w5+r3j{uFCMYV!hZRj0M?cRDjgB>S(QXV+p^y>nXV4 -zgp%RnWcneX5w}PQ9AGpCgHvCV0phc0X}vsk&x%R|^{i?wv$d1b%du5@$$zE%zoaJC -zfZDeG^L8CG+c&)mg843$aK&h;=}gL(o_1qWNnH%H`=b-q!IHbhpcdiJn%=Q-;X8sQq`rov0&4+vih%HPIc -zQ6b?LhW$-HFbf)Ae=*@aVl0U@-vmj7I)VdO)w|As*7&TgUP{NtbkpM{0Zs73WcXNAl4T^D;PWK_s%TIJ!_+b+#6m;vyx>WEI -zE<5TqRebht=ah)%pH6}&#a0PrT(gpgGgg;!l#HgoeViV;9%Fvj5&+E}x_q8VvOvCp -zo%38lAJU6AL}y`dzdrttEO~LS?}S)h`jj%XE3)_K7x&(Xr(_^{%%ZD8NiE@6Bo5I( -z+JgJ6{c3S%I4}4xAetnoA<&N5=WP+;;V;NEqQb6r;NFCCXc%Hc(3<$W<+j#+$DCVL;J -z39Go!i|&o+e_~#F{V3^t$|&vXW%L_v -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 -zeNHiCK7#A=dg`|mYoOhqHIu9X< -z_-qn<{K0N(b`x%(HuQr<@NGz9J+1PW5MMUdfrdmpq(-%G1w8oh(sQwA`*yS+YW2It -z*TNy`QAk-aY>MHQ=(-2V=eJgBrlu$D0>3}Wctu!b@{+aE0i4qLr*z?~fH9A%z1O@1rt(*H!{KII!ZA>gg2d9wNqJ(@t -z)(h8qiICuk>n{Z-Nvg}D@rD}CM+n0$Eyw{`@!kg9%q-qPcfO2haDh+GQl7*5$6cSp -zbu4wR{KfOUu~bX1Ic91Nda@4J+hAk@!a~J`9{6QY7V|5=59}>CH!HisFabDS*heIe -z#Rma8xj$#$_s#=3b^CDy>Gzh-pfee)sfxBu-e%mn@Po?FMu*n=N^+RE -z@r*3EdoW9ehcm_7=bKr?v5W7)e;3{8GTtGtn}L@f2*fwv+jqUu02P;=yAcBHm)3dH -zf)Z6fJ>(5nQ>F1}h%wa|CsbU(m4|!FqqcEmdy!AFG9a`yuhad9K4vZ{Kj8zyveDZT -zl3I)1+t*eXj9wLUtnAOp^Nj6{jl;iCW3Z^|gF=$Nqf9x!eT -zHSv>;*mI#I*ArRaE|%Lp>SA}!DP;hg2d -z0mo>!SrX>=4xZThWgax%e7cvSLiNdrh6HC1QsR{5=lw&(TrGsbII9EF%Y?AFgj8jj -z-n$r=uA70lBG`NWbtgh-+Qj8UZsl$O?kyYwc=qYqF8$UuktLW*q4*)uvyitNHaaJwYl(-@>lK!e#uMv -z#sTlM%B@@d`^u3P%jVIkW<(WxF6N_@Ej@g&+Pvs0K3e2)hd>SH?-JrZHso>Te?@cE -z)+21>mjz_Quv^)ody#Q-U-}Q6YNHuBVUZK*%VV~IXPL><@tc7(XC;9&NnDV6LP#>N -zuWq;N2F@X}0DeN(mYOFL%To-#uxeg+IWrx$Dl)0)&dwLg6@P?ADE?LnItZd_`_)7w -z$tO~0HY>BhT9o~F -z=KXRcWa^e+Ur0l1z_p~FDbnF?A0M59QnjSUIZ~kK=BGT=tvq7%_!FI5p;mYy{x -zfaI)Q@#!2gLdGg_vy}!Vj$166!hEy2lu{+H@VQl}3#XlE(gT7?5tbgFY7JLHmlHGn -zELA9w2b4s7Mk1Sfr_Ix+j_V7Myty!J7f1OK4Apeds5kG+B|D$?;vvBLvp>JGcT|H{5rkJ0kNArhO&+-+}Y -z-u}YsSG4gjG}XDGP%^*XQCRD_Xklq!tBA{&kMCXO%aekXJ&Eua>l$rcv7^HhGm~9A -zLc`%0WCw~E&eMVFO4OoL#8g;Ff~?d5zo!!%!T@2}Oru%PS< -zwP|xq*>WX3>mN6=60IXm0m$Dz;y06{^*lxnb!bNzG?JxsuwCam7cO;o8Np#YN7CcH -z^vv4lU6jIqN&e(15C~!Gc-rbx&rp?8Hx0Nww!MDx^pXk-Ws;ZCgy-Nbu7&>m?l^Xb -z04%$mhpmhf#?9QZG@#RBK;Iyu5^l?K6T>QG4Gw^uz(H4tM&;cd(9w2$nk{ox5mIcx -zsm?Z7_B=3q92X|#R#@o!{U1uF0xo5I+`?gu^5`@zdD8YuazVo7>qEp5WfH9#{vcq6 -zScwhG#jvg+QDz0CTJW0FY$Qsl=Rn)$Xk~4t@N7BPrrff#;TCVbCA_HrQ1fElf*i3G -z`73lWA?piySDCw#_lMzI?md1Sl_3R~;h1=oEP1>k_6G;f;r-tWA44H>+f0S6y9$;% -zXAdpE#6(9sLZg%OHxE%46ZmTxEq3}y`8=?-plTRs?NyCU6=FSz8 -zPnvZ-cihD|_p=SG5>|Q?y?;BahQCa2h@xz>=DDA9#i3%9m#Ivw;_H*h6%BmbjaXD| -z{nowYHwE8^R{Z<<1rZGt>B2&i}j3<5>%S35ctnIJ&CB_UDUU+!bH3vPp -z>^rAIXSw1he*b=7$DpZ-$K&T;(vp>#$nxf-Yfr~HLdkNGEBT!h7eeT;sr16a;56WF -z+0BK8-9eL}RaPJCtf|V8M-~7Y340VzLcY`Yf0>ktjzwz4&$)TawfK@1^W8dIHVPjP -zP=Ife>!mx7Z4~Nf#%WT1bdnrzm4uWk8(iRK1tYYUwnk2AKnWE-(r<~0lXi=3O0e(v -zNUJR%{7eS#rLID}IB16mfZfzoueVKPbXwJRh`gKqn5fPIP-tbHg -zv34ygNE^Rlf6IDiyYZsPWWD -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 -z3qrrW0N;I3I#Yr`ynZstC -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 -zaV-Vo1fW?5_}`bfJ`%lp+jsf9s>WMXv=ly`I -z2H!Wpp_xY;51^Nob>;1CLzAI}7@&{M;&V&6Ugre5@V7IQj^m$~OKgSF21T|Ct$%K( -z9bLUbeyui>Kyd~8VG*a%C<+-SAH1}EV_L^9i^rinCfZ)a(pzl||5FZ5yH9p}2BV&X -zSZVr2kT4w(oOuk}Sq1yBb<>w?Ns1WRw+&i|Q4uY0DYibK3Sad4sn>A~kNLE7@Vo3$ -z7Di`km^WYo8;Mb0cdcR?9qgD7AU|p2&6q`=eY$v%b&`LDlvvCMvg?JaMWYA-GZ}}8 -zCx4`(_oe)Lh%>Ra8F@UfPOSZ;XfE*=IJ~t@`{M{Bo$gw{iqjD%N7-*_drV$lOy7S$ -zJ^;l7$Lo?y>vOQh-bOdP2>gJ;%6$+rA~M^P3l3}Ifud9JeXmCM4tBpD5@7B2&>1Ce -zhkJVmBWbmHH<`U%c$b@vgGObAj()#~wk-Ov#{pa2h#w*OtpY8-$dRDSKx;=e4{?ma -zBc>=c706^l=%poUlcqm?@jM7{o5$&mpV)x;{89LFdP(R|)gw-?XzMkCF*Ps>XxyKr -zKXRoAoZL2PYgmS~CE%R}+D?BKOcWl1Rl&}r>@>cp -z!kHpwOaw48{V6OG&@0D2{2xR#wbQUupk|14tk -z)2i;)nCn?EqmAnT+!h9oGdS&NZCw>+umfq3x0cL2*k!Myy4O*afii{#1)_rXGIXW -zpjo=Dt5J`{NCbY^(fk!^JqH(B;1{AZudaRbQq25ROhb{?vncnIIMq*fqMJ-s1HL0@0ZcIfd7b8yIpLE^7dHgjPJ~u{o8KVffpLZe)1IY>cW5* -zXvFH!^~iCradrRitu?Bzg9m~?SPwgRHv2xvk?C>$%>LG}?S>A1U*{To+Kr^XKUbf%yM9swj75QP$)Br8v(SheRpFn`_F76gO)9jSO;l3$ -zIohmzQFf4Nnk`eUN!UvFPywR1XIbl&rGUs|m`v&YFL)r+jsJ_!05*R^SU=(gs7xu> -zBaO^OnQ7P9lG@Yui&A1l2CC63<(aZHcT;lxdT{Km!mP9wH7^mWaApdZL3V5;7U16d -z7og9xHM=D_MZ_CV#yeAAvlN(=Cfi?e=!J(v0Hr)}l%&uIdCk>Req$m8^ftRZPyML% -z$0!#SayDni3$$Do4Qv(XsH^&&Fj+gSybl~_{R!I|L}>)MHhh+igSC(ZR8u^K-Gw9B -zSVxDv?5GQTNnK89skv5ls62-Lq(~og#}Ps%;3FjNCUca0)jlH2MEye$V5diFQ4bK% -zS)hd8yxnV_1vML>QElp9q=FlwNTsO77)F6E5)(@?utn$LG7*Q#oKyKBFYXgNgy%AT -zx3_l4pZJ!AoxJ3t1UU}I^unoZ$+OFWN(k*WW>>oDnj=Pz73!8s`775pNW|g&nlv`M -zPk0WaXI}*VF!E*))tffd=$gs=-|-rP38O=zWN@@UnBG8& -zk;4Oc7%tDB!2d19p-x^j$QMMPJ%`m=Xfmfe{$)a6=|WP-i6$&C#8XsI!kbXqJq -zNWE2^F=Z7>51^lyLg}L>TY4JyUH}Kv0Q@ZWBLasX26W?t?{#cP|#tJ%yO -z$sHD9u*AK4&d*ILKFl6({>d-jaS^ld0JRc@s_nq$<$|yL_jH4hB`6{Dno(6neJjnT$@+u2q)&;9Dt*TTh7G@nZe~vt{3v6=WcROo^pFTX -zulA$j{azS{Ho@rM4-zRXo|?q<7j}tH*D%K0yCy5)3S#R-PeWCh@&2EqY}zuS_elYV -zE)vZBJtL~21m7r{G(CrhuQgBTFeMk+BVrXZRI1A4?ZyA2`llNk8^B%nCeb*w= -z-z$4MZI%!BeY_mgm!$ELpT3!F;eWzuYicBn$W0`FxxE!T$lM5W@sF#x$6iR(97DKY -zl=iy-LpzS}zAUu=nD0u%b6H!FC%l;)h0(SZX4*=@77)n7JmGXyoplb%0vb9jyWZ<0 -z^%M@N!w;&(NI4=TX22NV<6&PvDMgmjWao`V(uu+qrnu=v8&sGeO{fa~cCIkS!{^WLlChg7GNk4p3Ip3elF*&g#mvgV6W1^I9{*mTkJh1K{ -zvV@SlDz5bVC;QUuX@P!lgScmyHT?bg-8f-R5{c9pr>5Ddpth4pO*q5IqW+!VM9rGZ -zk%^DWjU6D0zO8LYWdgEINJ8JXrw<37>p-x?Cl0@O2ib;4IuRv%{yX2j3O9cK?XsJ* -z&N>UvKKrb*+yA0<1n4C;h*R -zfOHx=_Vp6z=~8J|JS547XgPQFJ$PhLsI#;VGsZyyJ3ZLCcO_8KmW3wT6>VzJ$UD=PF#KK -z2hiNwj<0mgIX=Q)lDu|tX-k%#gC -zz|1dLS%MQTJ{dkM8HnfLp}*`vv?q+^?>HHKB_(L>>Af9)`Nz+I9b8PA{zhX$0N`I9 -z-4#uwbL9*G+~Jq&wCByLmbkwxX5p&(V#I%R{b8hS;pe*{E9LrO9C-mo=T77_F0(Xn -zdf6WMGD$30QGtca$|Z3q--A!Hgr1MUlQ#jF-enTd7QO`ym;S2=12^RE3Ma6$V_2Gv -zhza0fC*TMUJ>4d+x#>rudl1nh9WeZ*ID7cdcpA+ZtL^KbZvYmrIv)=Qe}uYfT}nf_ -z$;j}U>LQ2V@r2qo5yp%H91AF8YJMJu>DczBp<642k4$hB5Ab_f|Vi3i9F}NX)YGg -zJh}hj0~qES5W5+PlM;RGtme0vRm>xXI7qa82u41VV4GCMOu|R^oL86%1~7%QJBv&P -z2B-uH@*xfz`#c!e60kZMd73)mIob#DLYt~x{G#($V#>TmVF8@P)bh*$^z3WJoRb%# -zdd))Y?ioVriSL&qdXz5K>j(h8{@AX!r*q~yyTK=CPjT5LcWy~r{oG_h47w>>c6H;~ -z&F#|JHxYi@X&AfptM}W$!ASLZGBLfguN6M -zH^+2dYaRy}yrivCHH%Sy`412bm5UZ@9g1Nu_Zo!l1XNLgrf1qzc!^h(8Hr(J&k>}3 -zCAcE-7)|hf_-)boUU~xXtB+5?y2_s-UA0QIKi9?oinRZRBYo2I&siPV_V$lQ`$cH& -zTc(X!;;Xr91MGFc#;6yNEgT0#UXsJlq5UpxZ{#c!KzFeK+Z=!-44HkM7E@qU$RJZv -zizU}zi!;wyB)tncPyc9J7|jI0;gOVtT`Q|f@b)(^z;v1`P20MOE%ac-k9<0|=>h`x -z#Acnry&~y;*PF_VpS4!^DH!&-S($*c4kK-QAvaYWLrjGlPGUV-CI*Vy5=VH!ji!DC^DTL<_p>J<1N^2^x?2=P(kQiuxPy6-Q_%&`C@;74v -zuQ&kQ@|WGalj+H>S=C;gqxMh^lKMG@8}$Li5;#Iv&R);MAa0 -zunyjfe}Kk@=`>%nIMf$GQ}3wLSb|@K`{QUL2EeqFO#rTX8zlfpq)nWh-H)r1>v5=p -z=v;ud8z4q9!^HI$RiSz5H_%*i5rSGmtsXO)#I29-lZ->tKN(7W6^%6xagRKAblL#Z?OSo2rCA_1zCDV -zeP?(Oh((=rY11TAZt7C3zW#kUWqE^K3u(EP%3*LgA$HArk(hqY0I^ -z%-bt&2x7IW_wH$h);}Wt069c1eXcAeGvHKstzHQ&&mKVkp-%aH>3J)WY^=fIo`F5t -zhd;}$#9to(@Qw95=cTe*GpF^&EC6610H=iVTI-zl%jJ~MZts+`-x9j0%jVUguQ!50 -z5+p6)AD{GMf)^C8~Sg=psh -zLb*7uP5%#;Rhp=s160o~Mdit7plk8<=r280gr9FeuUvfh_Ey}tt3%S7ZM$F147Wp1 -zQ!TuCc0@^Q4)$^;63o$I7||&7cmjrMRpGkA{JQ{6mw@EodxIf($)5CvN}$o-2+*^i -zUx(;BB~V!_ZUAs?#-jGeIvuUoBH+4AW=Zt1wY*_F0O>t4$B<3JAiH17q$Cws0Ib*x -zZ$%FDRd2>wS6_q^=T`|ElrFwjb5*;XnDNX{LesLV2VMIIFhJL!k655xfjQog-hA}q -z86Gc=ko}(G^x=RPIF2Wu=R_6VwbHufO{*oGwEDy01MMI^$)wbm@dUm(U>$>?5`P&@{kAL|H3rPp6*AQG;ydbh#h2GKm6+#$Q1Bk?FBPY!=?Z`4lS+kEWzcm{)U?G -zM^F0}PFQpTLLMDkTL;m_%|I<506T@UDIEtlwj#qT{IKoEooNURBJDk>B9=0@ERDrg -zQ7l|B6Add?L91H`(;I-_NT`-qG@0Y{{hQbAMt>w}ElyEH`}wt3bvMQ!cjIY-(ba}r -zDo&G_E6ROR;ZPAYi5cm%P0}WIU6RFU*zC#D`HsX*L^7I~NGdtGcQMGo6w6e1YSzc=J#e$RZ!H -zfUJS`bXtY+{Ksbk{JW)PC8*>Thl^MM-@hZo0JvwP;|#Q8g)*riYgKq(Xo8kZseW(P -z;1J;KQx{^^Necwrx(FoN$P8d+=@0s`{E}1AM#tIF-FYjX{K}W`dH{fbd30Agk<108 -z%-0hB7>5E$pg0*Qmdr@qKlk@5CzR&}Kw^N*A`qR8ff?a(`#ks+Zc9f+yrI+jgOVnKZZjg=Wxm5^ObkJ13= -z6PQ-4n!6MEr2ZgFY$%-YV;~knZ`6nGVSacp5b#GB$5D^a(R5?g8;)&BVFUE^f;VIDHbpueYbx@`<@yMV18++004OS={H?8Z(Aer -z!khs6YaDUlH5|7bQefcv3i|=3%x}b!x2zFx>)P3j)=h`tBjL}cGFZx$gR|;!uyY`s -zUH6$LA82pllr_vmvj_g%_efU8T;+B%Gm -z_EC7n7WKf`{enpa1c|(p}tYv^P|TR4QFuDSu?O?RlOAR -z}+>Or1U-C)Af<{ef?`H@Ep>>i^iG9{lv_CZ}J&X;W=kUz!9iG7KEtja+jR(aR*Ap${j` -zN#g9qBUm;qLBh`6kLXxrWgx5NA@?h^9EGMOtR7Fkv#|8%=iYjx-P5`ciL4K?j2B%5 -z2)!eI0tGMnN64OydN306B568FuBss>;8anLIelKLaKDrx%!01-n=XRhI2)&)SdXJ8Y6VCIF#oY4(u!N -zsm{gjmSrsTrF8w4SCk1x6q*4VM(F-G4XY|r&AlTY%(D8!@a}De(<;guTn$=MS%woX -zJ_VtwQgm)R;s5~W3e=MD&$)0lc6D&1>6w$T?=H>^eA!vRD+T~JKf3Fe$&CIXPW<5& -zeZr*KM+W??IAcMJ6D~SGALML^4xM=`kUQmLy(O?hsU5|%i~im?_a^u%r{km<6?mE$Ks0Fq -zfR&(Q(Dw(A454pNzj%JRT5-jq23&L5ih>qkcF#Cz@fGls_Sdj(UpId7{1Mf>!ls8Z -zBmK%QKD-acf!zcmQ4)I}*3M7jZ7W7_!c<}#9yd&8 -zsdwiIYVd*;SucSdF@qQ|H0nXuAQw*2gFs?5!Jl)VLIn(LNO)j6bo^x>#3;1tX`mZM -zY|6xfc{MoqjJe_j)N^X>0L^MM&TBC2c=9Mxv8({{p;%ISNJwjT|JY1`FZ*1&=H=k; -zCsaN@R7j9JG@Ecl86 -zz?atTwCI0IR`cm0q2_-7Yyv2UU|K+-wlauCGiyYnB?v4I?CT{UV4?AofIJ7IoBbg{ -z0ssS_zN!wFzpavfdu%d@W+ju{_n#ZFe`^mGEU(6yZ(HmLQC|3!GteYWx?$#Lktu1w -zvc@v(?ifZ~d=sYAe3KbKtS^R+O`VcpQdSbcr`~@mrqz{6jl0t<(#xHFeL@l2M&h_{ -zX9u1-+~;JHnJ&7Ijux1Ew;~np;Z+5&dR7jXtscRu*-80cI;W}`9YJzh%0; -zdCp72dPiv@nXc@EkPg6P0MPN6@=R=j+kNv2>N#cwe)NU?#1edH@6*sjW<(_JK`d)W -z5LJZ50fv`jMsW%8%5&gbx(4Ohj4aE2$|zBim1;bKRr5`(&lss((0+uHG0DM4`A7 -z5GMrj`wM4O%ewb`VEuhjG#?(K8$?tp5r@9*VNwtYspl^XYWUI3)6p=+XSE7Hc5v68 -z-u7YKecNM5r*)ij@nXzb(m)C~XPE$AYx>f}EuDh(_17axx?x6T09`|LY#CR9jEiHU5WtF+{%!S}m@*X^Ck4(Gg(J -z7GzqRBqMHijfTrlj^OMi37RVgnHIKvZX1vJtiD1G59hP7LBVu?#d?uv1|AP*H4;k+ -zmB3$822Y>_IbvHZLuoxnj3q;wHz&to7+xe&q#+|3x(Dh05Eu-O&|?(n9Wsz2rjWII -zE!bdZKZ+Re@drB%%c_C%-;Ksfx*zO-qir_MuEOl44X9}-bJi)`y8a0I$V4oqxzmzN -zqnmB+j9Se{cE}*W{r|0uJJ$HMUJ`WDv_olLd?KH*$@gb@eI*)*J;q3|hiGnwNf0?x -zb52ifC0m+Jry -zH4o8bN=aY05DDw_x^gM}iHJb17lBSQ(ge}2gz(+_Tx{Qnebv-3_W$3K6x-pZsK -zf8T5hJooT!tpCFvG|Vi;g_o~Ffb4PBs&+)c$Yn8S5!qWauf+p<2T&dK%2L-^S2IpK -z62J*NZJWEWu(A}NyY@73MzKi~qe&N`33GTLitU|YG!I5F9M7o5Jz?b%uo=USv%~vg -zkk(J9qoQ>#IVpvUSI1COsuSpFFxvOZ{clke+@QZMg77Ue?prWz{ -z6;;)!s8-K`V2R`n@Tx=!vXO@(5e$utkZCYNCR+rlGz*MQ>{hd?C)qphLn7%zIOany -z0YldSFhIaCJW4il%tS)Br?mI;%pep*I*V+hUq0ii3+goU(1POv#MlG -z$hHFmqAhuO@xF8hM@g%Dn7&BpSNZnlRF)t?e+|=p%F_8a65vhe3_p6WX*7Xk&Tztd -z^QucRn;v|xnHl609_{O@<^R_di`xGCKO#*gTEN=?V^%GUx+-YI{JclHBnmKIlz~l} -ziux+7y5dbZ@@x}&5BCW5x9^&tj&b?hR-!4KKwrz=>#_CrU*TnD0j~%E{PP3bk0#Q& -z`E38Qm!BIwus{rsBr!mmk{vPJTb&bZ*xSz+J|0cu;Ql`G19&_E75W=)qYFdYiL}vY -zKTwa$E~p?ndi-2)&J^SA{{D_9(Y$XEr<^wjC!Mnx*|aWpKhy9`GKSS>U518pKZ%e1 -z@)_|<@C3J;ak{(lW=La3jtt?_6B|)8qgFzNynY}j_jJ-^;-(%s%g%R}@s|CN@b`BE -zyEh}*+a{O(^!dQmXU4F2T9yEZjw9!i`~mxk;dj>TE5HC9WO?qvJ36UU%lX3Yc6fmg14Jxyb=66{ww6|W) -z4f=3GSrC<^9qsmLw$FtZ=FlYi0TJX~BQdo}PAlhzAx!J5%jB&rfm)ib1-D!GTaMq( -zXcB$Nyctke8pP6uih=^5@q~t*tK6k}_wVjUD$;^r`3lAGyjFO~b9^T$n=+w_60Cgp -zTD0wKL+_D3l~riBkEiooan2I-(>b)ZciwMo{PJaZnf(BNa{&12!_SvRvw>JVk-;dp -zaV7!bnrkkh&B!AsLc`f!($>q6x;}JvjG&`6OxmC6f0XF|BQz)CbmpW1%Dni&m#3k= -z)+a*xVk1E8qJu8(JwJRx97J!s@>DcTuT^~pOjU0D*1!J_8t1OWQ-^wS^B=b(no`=E -zg~_f?%+k#*Gn1G-d8Ygh?(f@0S|)*p3P0Za -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 -zQ+k;-9x~ -z&A`9?b3SRA==B{G{gyq=in9mXu;X_p@W{y~R4-j7XzX{s^S}7J_x}T?Oc^-WH9`O} -zhVwh0L4Vs>0uGy4;ASN}I653cU%MAG+~NvRWZE;ab(sx!uQg#wr964o7f8l(Hug>CBzJJ -zxmhc%on~SkexBZ(w8BM=KhO5FS>+lEdZBN87Q-Setc-0hNXL?rOz}8X7=Xu>bxwHE -zb+jFp(P=S4J?0-lc=i%Z88tBHEfu{F;%iP?7y#5pss!9}6{zfY(59b5o@=mlZ5f(+ -zM=<%qXY1)KW)Ro@e-R6~p#bnNzd!O#((?a4C#L?$#XlVOE6(TczcG2TYfO&I3hLh{ -zQ-3kzk6pb+x=AgE5F5Qn7s4ju#vgxQ4*u?~neh0oLj9{9UXnI>tTgcQ?@!<>zdMBd -z(qa+H+P8NfYSwHK9@nW^FHS!HTXdg03X9z-1lmNxKRq5nTZ<1U>i_uS}P0zmH-hDgwp3<5_A59{U0+Tc4;4CQ(Xc8czJ&1;|18Zo)|>nasa>! -zRxW-Kp_UXV&RyS3)_mOlf$zcQOv9W%gpnyXIw$=YnG506tIy%W?&n}8VKSNIs=@Bg -z09reyVI-aOfp@RPhd;ClZ`@Xk=-e3Ej~&23SEoGkT1(wecIqVwGbg>o6k#_&>vC(* -zMFUhVZ&00l%4ZERdB1G)=N6Wrw5AT(`2|UuUuX9x3%&MSZAKFJ2S}3Acp1;0sPaZ*}p#~_eL)ag{qT&qHml6XA$8`Eb -zPCDZJl~Y}l@Y23*-6Nvm2iJ8-p;?5-j*|VK19SN%zBBP_E3R)MpeKLOcz#eEpm<_mArUW(W*85h#z- -zE$ISJk^R=yHHB~>0+Z58S+x8XU8W?m|Mx(050da(L_NiWUoA#enN?`nl$#`%Z)6sf -zBQ2`{Q$ro_d#2@P8M-YN4I@3L1l#`ZyQB#m7?_+BjX?XS{b)LM3`d`SRJ66Si1JJc -z=g!Pxj6U;*O)K!Vuf7epy{TUAd++vRW^52WXAWa(xL-J_lmkh);d=TnC24`wVLtV- -zK{+Rb?lp*2!8U(Jb}lOF8<9sKz?pnPcr~G(FZfb|(5C``8*3)8<{umz!Vher28TSL|)N#fX_UAJZ*f+Kjrm@tfJbFXTg(zO%Ki>oZ&z=hivGAj*ZL; -zATTKnKV|waJXGSsL@yEm_$D~v6n2{dKmSH4vNB8yWB^J+<7ehqV9Azul7JTzh2KYi -zdq^{f6F@*@0Mhe2Kl})M1{ZoprZ7mt+}SsXSAX>Yyi?=E4D1Mysd4lW&j+yKzyISN -zeD3pahS6aGxb|Fe63tBvq5JF+I=5bu%Xs%2Nw4*jnSe|IL@I4UR^PlR0d#_$SV~`#J&FfJi6&3BS9LnV?h@YQMwJk^tu_mRvAIg4y4P -zvn?&?8yXamgH+$NTB2z0Psh`HOTla1R8S4W#yiLyup-$5%m7eLTC~h*lar8?Ou=Ti -z7t_J8@b>c(OC!NwmYD`CnE*3`lW5)5gs6XrKzb$vELLKKLv9$jep+cP!*dYBL&rp0G;{S<80^_fdo)GJlRW?N%R%oEGcrk0*cVl3 -zFX{aNyw38;EOF7_v17*`i=BGli%84`xNa73!vNs_Ja%xg#}{hla$imY@+f@(Cr@=D -zP?j%Rb{kX&U{taBqYC{O0HBQeZrLqHOmS8~RiRbX|ED>P$~4%-jTfdfGY_?E-h_(A -zTf{Z;O!wo$zNauT&>C+Ku6&lM;ktK!6Fyrx0l*}N$xPYv)Z=J9v=hz@7yP~`4(=br -z;zgDC~vib^*>ObSC|3}45h>nIFG={ -zeFYC)!cbE`{q7{9zII|5TVbqQffeQHC?JN)yJ03VPISMyM=lTN0w}%?#=a>MJ7pcH -z05C|VdBg*A)on1O7s-ym%Q^qljn=t|%ppf@C5$$!*uS0uFmPpL*pOeIji%;{yQcSi -z{bNYf{x=^0eBhD2Tgm=EAew!6Wctt3cHM_s5Gc)KFONv_k*U6-_1Oo&T9qGjwH^=t -zXx*a$KtqKM-~4XetML2ZeHyu?IkalMO6qQ0Q1}9R -zrbf|w?ii*9dW31A#NL#T=7TSz!yOCizgA{mj#0j1SBXzl9h8hYuATomL*+y`*oX21;t -zfcHJT`#phRcnMZV8V>EBz}Xzn*@pVxZUZ$*&>lJA9sIWaSs4tbQ4?a`WXDXY=TNG80hDhE$qzIqW`0p`q94kf^hOigChh0U5J_NaNYhcY}wR^iK#hs -z5Y6Yd^`hcXt(IcSKkk8HE}+fzlTRi_0B{;H&oIp88(_?@m5YKFvi&s)WI&oxi -zMr>`Z>_KH=S8V@z01zYqXx}Rs0JrDdx;zbE{zSg!8P%>UeJ7`+294X^gDkQWw!X&Kbw|8)W5nOg;g~o*I$b1ggQa^ -zkpv722=tX$!Ghn>`wfzT0}7kaeLmIi803k*oFsJe!UZx3dgp})MLV>h3BP%{0#jZI -zwz399SKfw-bTcxt9Jok=8lr2EW;S6}UWRDik=(qKH>2Vc5H4b~5f`_g!gSv_Od0_6 -z&=E!8Tz?nR7BymW!Y$4_q0=zmY&KiRJaW0Oc8?9h-j9x4Kx}RZ=91+w7S@Z`;)kLk -zdLjUDV;a)_(!@AiWCEm>7t(r;Ci(#sg13kOpl5gttxtYp8@)P+MBz_0lS$LE<}R)u1s{;td{?K@IRA-uAn&)4p{NkYka0NQcuelI24Sm3wyAxZu9gPbhX -z-rIvS7n=zTMiJz=xXu)?+oJf>t}PpZn}t(OyZ+iTB4H&)U~mWHW}adKusLZM -z8$@Kb2d2DIn9EiQO|CERmUREo4wC_3d<@d$6r2^s$XZ+>d^zg+R9OJutBUGejLgiU -z>G6NPgXEnLSTzH#+YfNV0N}3scN`%A*fgi>|L+Mz5StCaa;RBci0Gd<(rstGm4wk*K!=~Cw34cm=?Y9 -ztri2idVP3omlH9A2Se>MSZ%wAslge1?CYPxKYi_6w9Bal6KjN0paneE*^J?~^9Xw8 -z;yaVZ-wpU8#9Nm`!l^p*AHa9HFi -zQL2;uO2W?@ciidNcL9Uvdqp`f3DLVBGYM1V4@@Dcs{@Iv^`4B)w1C -z-Y__F57HlH`_>vv~xPZuJNA21-lUaBhQ9C>4Yk&P_L^wEyw&Od{+k9BG -z0^_PKEu -zw*$kM&IofLQHbN(Gj%S2PD7}|tY0vSfY_Z*6jUuD>R$(|-J!FqC7srmbgv^xFjIK= -z)pOCCHwnxj>Ai)_fQ0WY^gEXU1Yrt9Fg7`XGtEsn-`auzn_UVEU`OD{lpT+4FB6q^ -zu3O)MwQC!QF)jr53*3FW*MT`d&OLif^xhZUj}icYTc}%MS$j94*;%@41Gy~ON9)BK -zk;gM8++%q`8b-$vo$ZD(%LQB28rck*2lDDug*lK36zd-(GnZC)MjA>sFN4~oMr(Q^ -z+&mKU3o{TTW^(wspMMfVdv_sD{jWPA=!OBn*8h2-p8%jt?*!xyC+v_hH4_Ez9hENt -zp)o0PY1adJ)mF3&IJwWmy{j{gZkCh$5@73d?W*dlCCrDfQ(yGv=oH -z$P{=E0|OF;NLwWeO{RsKSy+sc+9gP5$DhGCpX#Ti^1AH4 -zc|r(WRxtH!BIWNaR3#GU$O{6b5z^0DJ;R_4J)S_ -z&)JYcUCB5d8AEh#5C)eK&e{!#M^)6z6JML+At#cN;77W9WmA^eaLMMSFxli7r`mT= -zW;k4OZa`+X4QF>faj&oK#piJ|1Hh*Ld`=P_f0ZmiAKCh`upE0gc8|cwgAkd#-N%of#9C!9ojyo40b8Aug<$o%Z7Q54?h*VL!g~@PFZ*AOAP{+@$XAsS6ka -zjeJw%7-~5U_fRh}i@0Wzl7v0gYf{oa6U+hn<5cCMMGeR=ucq^~LG!dKK<7~9uej&jINfvx=UOg`{sO`t=ITpR49_1d#@QYlvR2=L^>=K8 -zDHgsW+-rB8v_EV8voD@Sz~h(ubP6AY31Rm|#6lCI;EV^EIu~t(t!ybm1o#mi^1>m& -zkUUgXl1nu;HmAWgzc(~0(!vcHfU9<$mfF3bAAoyEOim**G$QuP=1J-1Mp)CG+FDUf -z046I#Gk&DGteEOJc>l!7U;RS)X|*uux+(*27yzvO$}o+MMZFvgsa_acC%h -zd9P+UAQJMS`}{uiG#x<5Kc~wNkT*w~4X5^9!t;+FM?qN*9zOCa^2=(G;B3`t>kuv6 -z(YEts3bZ2<3?z<;QE0NhU%wQS65lt>e@#-fKnB_Tr41|K%Fb0+n@-SmW=Vp!)qn14 -z1R6;~tz=_LQ6vj>+`F&)y~{ES^_=vSSV}TK-S^_7T#!@tvU;=QnlEEn-g7kV|)w98|zxdn_#8Is{}KuUAUSBkYLXNPg$xV~cuxrf9cjz_*(h76ZU -zR260wRATw9?<0E5p}%V_4>lp-okqv0o#?-KL>4w(sxWIEt{Qyykv%wdY!L7M&^`Fl -zued9-AM=5R7zr(wNp2U`)+C|=nio6S_E%R?f?N|joo>^RIX~vlgXE8Q0DGG_K<`~)sTzF=0 -z9->7{(fHQ8QB~j+JsYpI8I>tQr+1Pm=?Tc8y;%I1!egf)1!n{Uh)I4pOIIPiajUqe -zDiFtSnNIUdYEc(~FsZu;$zybpS{Y(oPw -zEAr{RXo4Srhs_L4`YLsh9&bP_6Fv-@qb+Ae9l^X%V1ke*zn5tD%P-5d3eL=I6xB5%qp%nT)fFw6)71&6q!)CZ -zCWi7G^Vota)Yk+AaiNzkw{QLTlg>d>UxOs*`Lufy2ag}dxeFw;!GKsAUcU*ye!c|0 -zyp_nijX2SJFk-N^7s()Mn}1PH^mXai~RwFCeG -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 -zT>yl@51l)MGduRdQpn9Z_ -z02sWdrUVnTYqUMFEf}B!7TUPMZS~?@Y`(P`FMMx1CI+Sj8`KVj)wC>T7TbpWADInaDR7W(#lRW7!iz`QC=wF!LOttFWUrJA;|+I -z6Ae*A(rySr(=t%Gd@J(G>f%@SMr@k4k{{1b45OczfSdj`sD0e&flWjO{)nAK=RWnd -zPm(F{UFc1L#NA2CB`{p&9pMjgn9&T+Og~QT+K0U)^yd#8!Pw9o)UMZQ=?2p9B}DO8 -zp>aba3M-1lw>5{}W%G67Pt-`gtm)0drk6eUvLnyJ8Jcm|eUe}!N%-|9z?Eo!{B_Yr -zjBNgIzhcHwPX)4F2GO8pp*#S6VUX;)G2zfpAI9_?L1y71d33iy-iIyCjtzHjgw<*h -z&s71{KtMTsPDO9OIEwzRsif}0y5r}hiIGuQa8g05CV>!GoWB5Yv-B{Akb9Si1Sm&=Q2MdDByTA1)p{jziDCKz}cx -zueDzUTKE&3K9E!3LgU6|Sh{IBY8q=`ciIKbWNn{lhAKj<0GFia_{u+=>|!=qKlLW|Svj~sA$#^+Uzku-T1UW(YlWHR_ -z=L0YsC5%o-@XG(WA_gqf_rKbwz4&VEuDl>wn^FM -zUqNPC)sk{CY$n0{$?X&kn=q4T_bRicRB!wx;qE_7sX5fmHOYD)qv`jzU{}WG2=dM7#LK>9xw2d -z%ImW;QT+R-Gw}CsCwiG%kLnd$X%TxcLW_UAzfF{B!Z6=KC33U5pIcP}%IeoDnRu_0 -zFCcj#Cogzf5Ih#VujMpm#s>v!k*mK9u#*7&`KN!vbALR74}bO_@agaW6teH;a^S>g -z=Mw*N%>LAC`?2ror*UTQL5vR02{V%!Jo``!%JZ>|DE{)z%Y{Ran`{VAzDPEb68Aap -z(yQcNruQ7D7v6i?F;jfI%_7>e&C~SB!g>|Ul8 -z4;26^2ml;uh)kY69ccR%rvd+U003|4tM8KxqoX|YX+8^(OQqx}0SS(0HjEG4lZMZJ -zC=F@36{ucy8*Gj&1bx#O?raitJH!J#bn*B26fVxi&PL_3&0=iW>k|@OfR^ePwn1+2 -zzr58~l3{}3IQ#_*kI9>%tJe}vwfNctWAJX3s*miWk?KZv8- -zci`xbSI~R07wntjPjF&cMz$Rd>z88LCJx`#!<8Y|4anL)+1rYFie7tJWaM$2-j*Qr -zRss=i9j0>RU6b}sq4}=}7<&JN{GNqO!~gzM3{B=GD9N)B!09!<-t(_?2I6cwVqpDe -zFW|MG{#>2|Xvv19dV?|pz#sJQdBf<_{&3rS6H-(oqZs}Op_yh80u_BC=drJ -zN16j2P3`#67k@(MH;@977k}x+H#^-lr!dPAhr$y)dTc9HlC-!(rs9yZe4~UhG5_npL -zmJekuhh%YzeTPZoE?-|uCR4TCp-B6ANoH_#`TD!3G1NaJ(|+Z&Bwbuz3-NJ;fPOE~ -z*(U@!Z*4tH4x1<{ieHC>r3wQ9N?_8BnWm1^!moab!+_NlLRLck+aC)J@8&E(z4!m- -z>j|je(pP-@2MC8hV;CQo%>Yqus&t6dGXQQ3;`X92*M!Hvn~(IYG?dn_M}B!7)GR#K -z4qo>J#(G;ZJ={aIEtt?hj$3=XvJ0_j^{ueGvT@yJz!hkJD*IP12@PRvunS{-9SDoo -z;&MMh?jro!lRNO+AHRS#n;P+*7ypcm+!6w`b{u)}H5`9=2T}Y3n3;+|jV|#tu)LCd -ztlG9#2z_Nkl_)>v5mylYrXI!5S3j^MHTYed -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 -zGvpBte8%P;8MzGy{x3v6?zNruhiipe(#z6 -zy)DeXCReUr#a^QSC&&#*CZ#g6F^E=#(XnzBHm~VG`|@VIesB_>`09S)BFOJX01#<{ -z-tmwOu<@cGu@vsSe--X}U^R}u+l%9e`f#;>T+n}>vcxn#-SZC8qZbj`_6YK{6 -zekIS00DDED*wGh>j#NWib{9fHMJ)H_EXQVLSepw7_z3|=YVZPPPQ4C&-G^a~^&!^( -zx8(m%@lxQ6HU`Ws*Bby32ySZ&g?Dz9awt`R$ -z893lz*st@VU4{`PWUnH2&`55=3h3lAsKH8`86<5W$ZfUFRgMyF@S;GHPrE?l}qMjz)A~uP+$9y2+%qEtgH!(wBHC>eBIDQ96$)W4e11u -zC!eRAv=UW2J}#Cg=i#AN=32TH*aiXGc5}-krVjr?bP^hC9z^QGUc@F}Apaj+IqPizT2KX`Bi9=MI9fMVS^edoDoXhAVk{sQ -zSFx-mhJW{DH?aYWE}SM;u3;chU2H&=6LB>cLvR3r!9uqe#4z|LREc0!6O76x1gcxe -zO^C<|#O(X=`g28R!mz?ByjBPY3x08 -z5LbtWh0E7mUyrq9`PVF8fu@Ff1j+R?Dm47o|9ueu`&XAxNj^Pi4tNbmUJ*!N^+6~V -zHF6RwWC<|uQqK$pv5$}5YYufGb#X8B#!aZ%e4psy5M6?q!_M{yWR#hF_~{dS$daER -zC4LlIqyg0p6>t>a`HpUPK>Uvk)69h#!I1L;?fGzqvX-7vcicwy@Ep_wV|ZlyH5JQqeMruJGKZUEI-T&s%w0(-A6WU6sUI_ -zohTSJ;P-v$oXhE9ugkW_xgrEiID^Bs@+@8rH->!{#3<_YGVu>!2aHjWyj^T=OnPHU -zKyO%4Uy9`eG-A<9Rv$5V7noszg_oO4L^~e_MRqevmkvhv67S2Gki{ogYZFF>AuC;? -zRn--knKZ%_IO5IBQfh-?3Ze1ZO5ykXh%N7^8h_b&OCh6eoSel26K|~g;ARy4et^7QCMN#*VE6H3xW)S5uXo|nCBN$vBDTej@)0#X)`` -z#n$fz`^ggI`Rc|#UK5J_5Z -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�mNbhf|L- -z=s-b>*<25f-={O#~|p0^Z~Ai1`@Spf2bPsUt|r_0f*6R1FBt)oWc -z1t$vSlm3wV`ypua1#TDvH7Nvj7G-tZ@?{hdAN6LC;N2r<9K2(^ieDRI(Zp$TS^33- -zoZDS$W7AYt{njSgA76T9_Xe}=aST0b;kkX`{K|Q5V5filQSPpR{yVClJ!4G#x!*=-exHu(GaC|+Y!tL6nczy@*IfPi7i>8$|CEjf>T%3GzU5tE+=6n$B; -zv)4HqBu3yDw4i{1r2a%;>DV%m`#hMb>F(i+%AwpADK+{tU!lZEQ7?$6gbDMlP7t0? -zW2+B*w}O~v3WC}do+@3^vM4Gx&)pg1i96qKOR}E9X2>7<;O!q -ziSpBSPZc+J#mpPA!IU}yeVL8gPVU6ry(P`?aF}c;IbLPkGxFZ8hjYGL6^)2*)7Pvt -z7u!c2Jkimg%N_v^$tq2VHGW)QyOj5YVvGc*vPd>w9PfCWocZNw`qUt}%qy-)3YFd- -zmv+(wCp{mNR27x3$~9&9tL49a(EintVycCpWJuo3{sK98&j?b--v40vaG3c8S8 -zX7j5)??<@}eM7`JZ3^iz5wJ!*08C(z!I;!( -zk?4e5$%hCC7sLY`e?s?9y-)ZrqcL}XLhpwy%@xcww8ws?2>^ti$D;P6L1K3X2lH9s_&9`TAdg+zfQ{=JH4I7ERc(Y3V(B!x- -z=JT$=RL#aXN^!!nimh(Y^{>)xOF8sY3Z6eM_}IGEe;XMS!rmb_0H(e-s`V-gA3ua{ -zb3kXKc#-@5XDrmtade9<786h2xN>l^)r@>4Bah!^p4I2{UV%t@V#mFm;8WsEL_${* -zStYzlDWzz+Rr9IFtKvq%q{e@jMiFffU8Vu^q9h>nINY1M;;wNEgNuMMT?*XZ6dJ)-{$c@W2(^cHS|LkDUF>Ej#YbGKQEz7O^kF~zuHGs= -zss{OX9pCD_x1cQ%lnCGWwG#+8w*mO@4sx(dlDv!~lIQWN5^wdvnd-ydCZ_v}#m3B{ -zX=g&Y4FY%nzJH>^IDDWjipHn%NvbgxpwD>vWx788@maIep^@EdD-%^PUcS6dxg_^= -zSB*ml)e{*YIGXX5wy2fW)iWV3JU8gl$KZZgpcL>+!=?lN3!=`pJA#K}saK=~bc&7z -zBXScrMMsCvS#n0+f9*i#|IGiuHB?QV4vwfCTB -zcTjY1NV6>K8utxuXp(aK$(HdE1I!YI%&$evwFt}}rk&kgcZhtdr}~pLuy@&v+9*Yb -zd|gv;fc+KVcYfr#dY90M3J$?&9w%*P;sR($g#bbnLS&F7bd=SbyI0p6ra7AkE5Sh* -z-bb%oH453wg(O~*dMt)jr-^j)?u{|?*->FBP)2q9@@|ExN0^6i1^#Wu4oWqq#>39E -z17i(8eg706`~tud#wAL?2a!3b7IS&S=~thTt&kV59L4uOp0klE_FJ0a`IvnEQrb#9 -zJ#9<%N?3R-#SeG27A@WuFWx}Hn7R*ZQsfZlIsX7k#2wR}4jn$;{AAW*GcMexV6VXR -zc#=Il%o-^FEKMWKd|{PWb2Vd9KKH&goX=3zm}Z&fDwXE`+yrygcQwf{@pb-~B_R)I -z?hpV3yptj&Kw&cEJ*L+K(cYKqV{EAuoNTZ>J?Sv?8QJ`<{ue%a?{|OXajGmbVvp6h -z{mz=QBo*r9@81kGZkS;gD@8BHz-+$ha8S#&LBRZN{S)$`;i<`ya -zT!}Zj+sh!XP)gQ>TuEfIGsg*O#~d(4|1j*6{!W_`c)Lb?AH -z##`LtfNhUSseCUUl$pWu^#V -z4k6>Huu33A3N<@f(R*RF-b)7;J0qeBs#FFT22&2}OvzaHt9>P%@=Bxs0rL}bASh$! -zDsdvk6RR$<_?Ql0uD-YyxRqf+2?~VoVVg#O{~%9Iy6+|r9dW}(J7y3R#&UNK8jZ;M`hr>{Cgcl_Yx1lb?_R!OJrki{ysFYkX#VHX_!C&MX=4*#{) -z=@74;^b33ktFC{1R*yNxE4&v3;(>E;%c2@{GeJd74uUo=!HU21#$ea$oh;fylw(5p -z4!OrA5n=TY9ON^9wlp9I3N5>ni~ygR+m7;X#2B;r=m){Z>v9|wZfAZh>`bym>C?gJ -zpAD=)?8H-V)@T8RuxZh%l=Y_SMgjufx#QTVK6wE`D^EV(`ZzOeU2PFHSU9x5A?he$ -zgq$nx&tM86Akow+ZV(#+B9(N*7Hk@!vUhB}oLK5Xxg8K_=rg$)f3eTTy8D4IjH@%M -zDL%CrCe&do3?%rLz_|VPb>(N94!rnbC^Q^OA#PNfFzJw9P%QUw3F}m(ov=qtE8i8N}17v^{%>zj>I|zv=fh-(%!! -zyv70Dhywu?c&t=ZOrfeIJ}zWOf9i;bnEd3m${gthqU`SA$i -z0$kXmYO{l`7$WEC;LEn#CV7Ja!t7e5jhBKgM_yN&c};|Y}f$oQsz=UF+BHAcOBQSLds^!<(9 -zRJ`V{POB(><4|n4JjIxN#P+^cUo~@0jMcZO7$Y0k-G86q -zm-|MU%$f3C9y@8&iRVB$>b2^4x@lf2#hS}@?7VgR1D}Q1;M63Kt4}v|%TXIH<{T*l -zv>B;a{JS|HN=gbWc8$r=&!*;)rg~HB+7OrI -zRi=m -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 -z^9>zi=53(}ea`S*Hnu>z1ENuxRea7 -zA?)xwNYhEf0i%@`gbHQ~{M{AKQlD9)pZrwwpf;BY@mA)3#@>bg&b`+odYP~sR%H1B -zD!y_GYsyy-x^W2WAGy4>=1(f~E -zBfhZIlC2v?#3j%w|B$IFxP}#8Lq0mF`_q0ik7Z`g`vp915bF<`b0GAO)ha-q7~PsQ -zNQf88-!0y_;Z4EUS3_%TMuj;aEeiQo)ouY=+xRT&DEwp_oBOZ#AV41aNlk0=|&|b>GCa=ogJ&L9JR~Z+EXyQ#r>$+5kHi9C5oC^IH_jB^fqe#V>HX9JvH+_rNcADQw~H;R#6ldO)@~he|KWAb -z4#;5~zBO8edF$-lq%BW;D||o#0@}ce9EMM|CdNoNP1;VIP?H}|i%FI~%+K@K&~mG5 -z4L02U_7@frRsp0<9{IOgN@Ze3GSYt^7=&J_!?&J@Zz5JRP-s_o-{Ey?t`~>yEteDC -zF}H+JkD4w!VEp6yS~(YOp>zg+1>tn{jE|3oWWemnTXXjtU|e98lCX1bO>NYd;2Uo( -zLDMca6=9mkCp0IZ?6xD|LPNQ2juBV-pMk|@!U?_VIVhqt#}!;b`^TISL>>Q -zm9v+%*{aZZ?=X3}#uVB~nAWfZQ@M%@1(rPcyDq$A^sl3-?dp_sV|f--jH|$o+R^E| -zu1oj5;WwxB_5x( -z=geOV!$K@!0mg^EVQHEba{&UVSx#goY`pm8yB#dT=>c=6BpOeCJ^dZJlYn@*VCN_5 -zA+OMDyvXE-Zxv5p-*^WJNq(0YnIvyooBQ=s;6AjDYXe{I%aLrD-qzb~JIBC?(40RZ -z(oOIYSo -z$cHrrRgpCekX|!!s0mq(j25Tn+FZGd?jQH(}esxaprhx741cwd3xz -z>A($?cU&{zOS+(euIPrE{{kTs36D#yM~Nv_`~BqsPgyjm)lUV;{Q@rtQ -z6yTlA?pRQyX;Wc;ts1M8TZjLsLnxY6>tqaFT7Pf0@`)LiS_I-2R7@~)l|Q>N4Q$HlekN%fPA@8h0226k -zK0`QxAMqj&xw;A|*z{i;hyD(gu9hFJJzho>BfZ-!1SuK#1_*-PcHjSQjmh!Kbx&Ou -zm$(SByg|de>__KgZhQ+Dd*MVNNWRQcB$Hedp-c$6^tKyEebJW@hw(-JL#>l@e+3-P -z{Ok9tV$2jY^dw>S=TZ3zNK72 -z%kg~m-APjsBHBo#@Fn+_w-~j~6>W>_Tv!tPG_vw@;!597H|eXz$B_4lKSJ-1HD^vM -zYQt05zQJQ_u(Q@scQ?1m{C=2M!eax}T__L{LTJflMt#G! -zgZl38LNPMA(>Hs?&?jgaKp{G8RH$FXu$=P3-C^WgCvJN>szWhp9Zboy-@cRa-xkdp -zD~>Ehv7n<0X>`vON8|>L!did6B$K?C`1aBW_hG{ly&&gg*>sEF&`iw@hayAaxit?R -z*E?F4-E-$4vWFim+M$l$B?l+Ndy|4UETnH6f`p%mggX>1MTQ*tj418Zd@L!wXV_OW -zS(?ntmUhJyYhM)>ZQ?F-8lr;yM!bNrxc}%)$3t%3l8bsJ0~>;@zScBANpSa7RguV@ -z_ZK9|JTGSQ*;ljnV6*oC}Jaegr6l`w3cv -z+%S@5SZ04YGIA|smR88jTjh);a(;GPh6;sT5IqSv+zL8o(Rs+uIWE3$G%z(mCv>R4 -zFKEQ9e7)|U3PRrf*bSQWF?RD9Ug!8nQB#w`?AgW?^7oo2ZK6JnQ@=tFMd8=KzF!>% -zI5|2~U~jCSc@P=iTXr3TE!aooo(aE@A{=Y_Al{T2k=>ZbQSEB1$Ljd2hPaX_;GTkH -zC9Nn_KAjjdPEy$0Uii2uL=q|dd@!U;^h2mc)}&1AwAxj|_i4s-KT?h@($)XjxNOl$^9rd8ZgO@nyr$z-t*0(fp4 -zxdF%htMhZq@V2@B($Tqc6r}aaX&y`LSDk6oW6Rqq+c%DmNKv`B_#GCZ^bPv?*YZf% -z4P(Nj)ssG;lpnL{fN5p!Kc`$sr(W_WQD{)oFRc9< -zcfxDekTfNL8+OcNwKJjo20wH?j%0QAai@6={_z$3iba6L+}AinJfN>F6TxeLamWny -ze -z%==m86RiSStz0rr801!I5zSUzDUzK9wJ#_Xt4*1%xjr{*p5ei(WvRyK;9LY;cLyDx -z49bR`G^pG!p}Jyi9VX_mV7*_zr)yl`UY2@(O>3F7MBda{^utlF&c|Pk0JN!@;WsGE -z@^z1UNa?};&T<79cd%&p@EhCfGe!vy@|b0rsJK25R5gd-=Gx8PLHIy^d8{<9%8laF -zQuz}}E6h*BXJ7Fv5k)nj3yce`E4EA>S~YC4SENQ+>0PEto+%l@U5AJIv5 -z#=pZETiwITc>}fz)+K`X*^VM5!3W|hHP$vv-1pqCiH9yluU*_{++VgYwWEXCzfbtN -zsr=J?W3N8#c~%}C@#)$IRTE2#Zilx}`wJgqT`eR0z&KwEvHp(v)U$PpfQ_%DyN0i} -zN4pxW&t8bl%zo_Re&2e@(A&QJ`1Z~&ix{0=_P*e+I-rqY*Wj&H%jP8yT-M%SYy11= -z|EjP(H^=3O%EY7iW%gMI4Fj+jmOR(T_%|Qo%aYEvk2((B7QAm4A9w>ONg@zc8N7ZqgIr;YE@%V0Pp!drF2nG -zRtD-nSCvo{kTG97{kwC_4&o`XgkEXyt|31@+L9s&s%6U1e29rL~OUks__rCnA9v0d@N&e6Z60#i1Yk -zfihK>sxjS_8atzLZBp-F_Gjvr>05rMOgPHW4S~NLAwVeqmlI>Kx~PkyQNPi6#L$1& -z>6_G<|K=^@Ypwq;8usl`|BLJ>Ki|L4Q8RY4{%=D^ya?6)TS2C&(SI*)T - + WebGL Big FBO Test diff --git a/content/canvas/test/webgl/extra/canvas-compositing-test.html b/content/canvas/test/webgl/extra/canvas-compositing-test.html index 07d8c258faed..da658e4fccd4 100644 --- a/content/canvas/test/webgl/extra/canvas-compositing-test.html +++ b/content/canvas/test/webgl/extra/canvas-compositing-test.html @@ -26,7 +26,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - Canvas Compositing Test diff --git a/content/canvas/test/webgl/extra/fbo-lost-context.html b/content/canvas/test/webgl/extra/fbo-lost-context.html index abc229cf8888..43ab698fd789 100644 --- a/content/canvas/test/webgl/extra/fbo-lost-context.html +++ b/content/canvas/test/webgl/extra/fbo-lost-context.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL FBO Lost Context Test diff --git a/content/canvas/test/webgl/extra/lots-of-polys-example.html b/content/canvas/test/webgl/extra/lots-of-polys-example.html index 95b5846a8251..a92f6daa1c20 100644 --- a/content/canvas/test/webgl/extra/lots-of-polys-example.html +++ b/content/canvas/test/webgl/extra/lots-of-polys-example.html @@ -7,7 +7,6 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - WebGL Lots of polygons example. @@ -34,9 +33,6 @@ function init() { function main() { var wtu = WebGLTestUtils; var canvas = document.getElementById("example"); - canvas.addEventListener("webglcontextlost", function(e) { e.preventDefault(); }, false); - canvas.addEventListener("webglcontextrestored", function(e) { }, false); - var gl = wtu.create3DContext(canvas); var program = wtu.setupTexturedQuad(gl); diff --git a/content/canvas/test/webgl/extra/out-of-memory.html b/content/canvas/test/webgl/extra/out-of-memory.html index df6a163bbddb..a3392f85427d 100644 --- a/content/canvas/test/webgl/extra/out-of-memory.html +++ b/content/canvas/test/webgl/extra/out-of-memory.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL Out Of Memory Test diff --git a/content/canvas/test/webgl/extra/out-of-resources.html b/content/canvas/test/webgl/extra/out-of-resources.html index 7275ccf4d21c..8fee5b0e84e8 100644 --- a/content/canvas/test/webgl/extra/out-of-resources.html +++ b/content/canvas/test/webgl/extra/out-of-resources.html @@ -7,7 +7,7 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - + WebGL Out Of Resources Test diff --git a/content/canvas/test/webgl/extra/slow-shader-example.html b/content/canvas/test/webgl/extra/slow-shader-example.html index 549983257b71..fe64e90f9ae4 100644 --- a/content/canvas/test/webgl/extra/slow-shader-example.html +++ b/content/canvas/test/webgl/extra/slow-shader-example.html @@ -7,7 +7,6 @@ found in the LICENSE file. "http://www.w3.org/TR/html4/loose.dtd"> - WebGL Slow Shader example. @@ -19,7 +18,9 @@ found in the LICENSE file.
+ + diff --git a/content/canvas/test/webgl/extra/webgl-info.html b/content/canvas/test/webgl/extra/webgl-info.html index 5a443d4e5adf..5f93f1b29146 100644 --- a/content/canvas/test/webgl/extra/webgl-info.html +++ b/content/canvas/test/webgl/extra/webgl-info.html @@ -7,7 +7,6 @@ Use of this source code is governed by a BSD-style license that can be "http://www.w3.org/TR/html4/loose.dtd"> - WebGL Information